SqlConnection.BeginTransaction 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
多載
BeginTransaction() |
開始資料庫交易。 |
BeginTransaction(IsolationLevel) |
使用指定的隔離等級開始資料庫異動。 |
BeginTransaction(String) |
使用指定的異動名稱開始資料庫異動。 |
BeginTransaction(IsolationLevel, String) |
使用指定的隔離等級和交易名稱開始資料庫交易。 |
BeginTransaction()
開始資料庫交易。
public:
Microsoft::Data::SqlClient::SqlTransaction ^ BeginTransaction();
public Microsoft.Data.SqlClient.SqlTransaction BeginTransaction ();
override this.BeginTransaction : unit -> Microsoft.Data.SqlClient.SqlTransaction
Public Function BeginTransaction () As SqlTransaction
傳回
代表新異動的物件。
例外狀況
使用 Multiple Active Result Sets (MARS) 時不允許平行交易。
不支援平行交易。
範例
下列範例會 SqlConnection 建立 和 SqlTransaction 。 它也示範如何使用 BeginTransaction 、 Commit 和 Rollback 方法。
using Microsoft.Data.SqlClient;
namespace Transaction1CS
{
class Program
{
static void Main()
{
string connectionString =
"Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local)";
ExecuteSqlTransaction(connectionString);
Console.ReadLine();
}
private static void ExecuteSqlTransaction(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction;
// Start a local transaction.
transaction = connection.BeginTransaction();
// Must assign both transaction object and connection
// to Command object for a pending local transaction
command.Connection = connection;
command.Transaction = transaction;
try
{
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
command.ExecuteNonQuery();
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
command.ExecuteNonQuery();
// Attempt to commit the transaction.
transaction.Commit();
Console.WriteLine("Both records are written to database.");
}
catch (Exception ex)
{
Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
Console.WriteLine(" Message: {0}", ex.Message);
// Attempt to roll back the transaction.
try
{
transaction.Rollback();
}
catch (Exception ex2)
{
// This catch block will handle any errors that may have occurred
// on the server that would cause the rollback to fail, such as
// a closed connection.
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
Console.WriteLine(" Message: {0}", ex2.Message);
}
}
}
}
}
}
備註
此命令會對應至 BEGIN TRANSACTION 的SQL Server實作。
您必須使用 Commit 或 Rollback 方法來明確認可或回復交易。 若要確定 .NET Framework data Provider for SQL Server交易管理模型會正確執行,請避免使用其他交易管理模型,例如SQL Server所提供的模型。
注意
如果您未指定隔離等級,則會使用預設隔離等級。 若要使用 BeginTransaction 方法指定隔離等級,請使用採用 iso
參數的多載 (BeginTransaction) 。 交易完成之後,交易的隔離等級會持續存在,直到連接關閉或處置為止。 將隔離等級設定為未啟用快照集隔離等級的資料庫中的 快照 集不會擲回例外狀況。 交易將會使用預設隔離等級來完成。
注意
如果交易已啟動,且伺服器上發生層級 16 或更高錯誤,則在叫用 方法之前 Read ,將不會回復交易。 ExecuteReader上不會擲回例外狀況。
注意
當您的查詢傳回大量資料和呼叫 BeginTransaction
時,會擲回 , SqlException 因為使用 MARS 時,SQL Server不允許平行交易。 若要避免這個問題,請在開啟任何讀取器之前,一律將交易與命令、連接或兩者產生關聯。
如需SQL Server交易的詳細資訊,請參閱Transact-SQL (交易) 。
適用於
BeginTransaction(IsolationLevel)
使用指定的隔離等級開始資料庫異動。
public:
Microsoft::Data::SqlClient::SqlTransaction ^ BeginTransaction(System::Data::IsolationLevel iso);
public Microsoft.Data.SqlClient.SqlTransaction BeginTransaction (System.Data.IsolationLevel iso);
override this.BeginTransaction : System.Data.IsolationLevel -> Microsoft.Data.SqlClient.SqlTransaction
Public Function BeginTransaction (iso As IsolationLevel) As SqlTransaction
參數
- iso
- IsolationLevel
應該在其下執行異動的隔離等級。
傳回
代表新異動的物件。
例外狀況
使用 Multiple Active Result Sets (MARS) 時不允許平行交易。
不支援平行交易。
範例
下列範例會 SqlConnection 建立 和 SqlTransaction 。 它也示範如何使用 BeginTransaction 、 Commit 和 Rollback 方法。
using Microsoft.Data.SqlClient;
class Program
{
static void Main()
{
string connectionString =
"Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local)";
ExecuteSqlTransaction(connectionString);
Console.ReadLine();
}
private static void ExecuteSqlTransaction(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction;
// Start a local transaction.
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
// Must assign both transaction object and connection
// to Command object for a pending local transaction
command.Connection = connection;
command.Transaction = transaction;
try
{
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
command.ExecuteNonQuery();
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
command.ExecuteNonQuery();
transaction.Commit();
Console.WriteLine("Both records are written to database.");
}
catch (Exception e)
{
try
{
transaction.Rollback();
}
catch (SqlException ex)
{
if (transaction.Connection != null)
{
Console.WriteLine("An exception of type " + ex.GetType() +
" was encountered while attempting to roll back the transaction.");
}
}
Console.WriteLine("An exception of type " + e.GetType() +
" was encountered while inserting the data.");
Console.WriteLine("Neither record was written to database.");
}
}
}
}
備註
此命令會對應至 BEGIN TRANSACTION 的SQL Server實作。
您必須使用 Commit 或 Rollback 方法來明確認可或回復交易。 若要確定 .NET Framework data Provider for SQL Server交易管理模型會正確執行,請避免使用其他交易管理模型,例如SQL Server所提供的模型。
注意
認可或回復交易之後,交易的隔離等級會針對處於自動認可模式的所有後續命令保存, (SQL Server預設) 。 這會產生非預期的結果,例如 REPEATABLE READ 的隔離等級,並將其他使用者鎖定在資料列之外。 若要將隔離等級重設為預設 (READ COMMITTED) ,請執行 Transact-SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED 語句,或立即呼叫 SqlConnection.BeginTransaction ,後面接著 SqlTransaction.Commit 。 如需有關SQL Server隔離等級的詳細資訊,請參閱交易隔離等級。
如需SQL Server交易的詳細資訊,請參閱Transact-SQL (交易) 。
注意
當您的查詢傳回大量資料和呼叫 BeginTransaction
時,會擲回 , SqlException 因為使用 MARS 時,SQL Server不允許平行交易。 若要避免這個問題,請在開啟任何讀取器之前,一律將交易與命令、連接或兩者產生關聯。
適用於
BeginTransaction(String)
使用指定的異動名稱開始資料庫異動。
public:
Microsoft::Data::SqlClient::SqlTransaction ^ BeginTransaction(System::String ^ transactionName);
public Microsoft.Data.SqlClient.SqlTransaction BeginTransaction (string transactionName);
override this.BeginTransaction : string -> Microsoft.Data.SqlClient.SqlTransaction
Public Function BeginTransaction (transactionName As String) As SqlTransaction
參數
- transactionName
- String
交易的名稱。
傳回
代表新異動的物件。
例外狀況
使用 Multiple Active Result Sets (MARS) 時不允許平行交易。
不支援平行交易。
範例
下列範例會 SqlConnection 建立 和 SqlTransaction 。 它也示範如何使用 BeginTransaction 、 Commit 和 Rollback 方法。
using Microsoft.Data.SqlClient;
namespace Transaction1CS
{
class Program
{
static void Main()
{
string connectionString =
"Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local)";
ExecuteSqlTransaction(connectionString);
Console.ReadLine();
}
private static void ExecuteSqlTransaction(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction;
// Start a local transaction.
transaction = connection.BeginTransaction("SampleTransaction");
// Must assign both transaction object and connection
// to Command object for a pending local transaction
command.Connection = connection;
command.Transaction = transaction;
try
{
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
command.ExecuteNonQuery();
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
command.ExecuteNonQuery();
// Attempt to commit the transaction.
transaction.Commit();
Console.WriteLine("Both records are written to database.");
}
catch (Exception ex)
{
Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
Console.WriteLine(" Message: {0}", ex.Message);
// Attempt to roll back the transaction.
try
{
transaction.Rollback("SampleTransaction");
}
catch (Exception ex2)
{
// This catch block will handle any errors that may have occurred
// on the server that would cause the rollback to fail, such as
// a closed connection.
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
Console.WriteLine(" Message: {0}", ex2.Message);
}
}
}
}
}
}
備註
此命令會對應至 BEGIN TRANSACTION 的SQL Server實作。
參數的 transactionName
長度不能超過 32 個字元,否則會擲回例外狀況。
參數中的 transactionName
值可以在稍後呼叫 Rollback 方法的 和 參數 Save 中使用 savePoint
。
您必須使用 Commit 或 Rollback 方法來明確認可或回復交易。 若要確定適用于SQL Server交易管理模型的 .NET 資料提供者會正確執行,請避免使用其他交易管理模型,例如SQL Server所提供的模型。
如需SQL Server交易的詳細資訊,請參閱Transact-SQL (交易) 。
注意
當您的查詢傳回大量資料和呼叫 BeginTransaction
時,會擲回 , SqlException 因為使用 MARS 時,SQL Server不允許平行交易。 若要避免這個問題,請在開啟任何讀取器之前,一律將交易與命令、連接或兩者產生關聯。
適用於
BeginTransaction(IsolationLevel, String)
使用指定的隔離等級和交易名稱開始資料庫交易。
public:
Microsoft::Data::SqlClient::SqlTransaction ^ BeginTransaction(System::Data::IsolationLevel iso, System::String ^ transactionName);
public Microsoft.Data.SqlClient.SqlTransaction BeginTransaction (System.Data.IsolationLevel iso, string transactionName);
override this.BeginTransaction : System.Data.IsolationLevel * string -> Microsoft.Data.SqlClient.SqlTransaction
Public Function BeginTransaction (iso As IsolationLevel, transactionName As String) As SqlTransaction
參數
- iso
- IsolationLevel
應該在其下執行異動的隔離等級。
- transactionName
- String
交易的名稱。
傳回
代表新異動的物件。
例外狀況
使用 Multiple Active Result Sets (MARS) 時不允許平行交易。
不支援平行交易。
範例
下列範例會 SqlConnection 建立 和 SqlTransaction 。 它也示範如何使用 BeginTransaction 、 Commit 和 Rollback 方法。
using Microsoft.Data.SqlClient;
namespace Transaction1CS
{
class Program
{
static void Main()
{
string connectionString =
"Persist Security Info=False;Integrated Security=SSPI;database=Northwind;server=(local)";
ExecuteSqlTransaction(connectionString);
Console.ReadLine();
}
private static void ExecuteSqlTransaction(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction;
// Start a local transaction.
transaction = connection.BeginTransaction(
IsolationLevel.ReadCommitted, "SampleTransaction");
// Must assign both transaction object and connection
// to Command object for a pending local transaction.
command.Connection = connection;
command.Transaction = transaction;
try
{
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
command.ExecuteNonQuery();
command.CommandText =
"Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
command.ExecuteNonQuery();
transaction.Commit();
Console.WriteLine("Both records are written to database.");
}
catch (Exception e)
{
try
{
transaction.Rollback("SampleTransaction");
}
catch (SqlException ex)
{
if (transaction.Connection != null)
{
Console.WriteLine("An exception of type " + ex.GetType() +
" was encountered while attempting to roll back the transaction.");
}
}
Console.WriteLine("An exception of type " + e.GetType() +
" was encountered while inserting the data.");
Console.WriteLine("Neither record was written to database.");
}
}
}
}
}
備註
此命令會對應至 BEGIN TRANSACTION 的SQL Server實作。
參數中的 transactionName
值可以在稍後呼叫 Rollback 方法的 和 參數 Save 中使用 savePoint
。
您必須使用 Commit 或 Rollback 方法來明確認可或回復交易。 若要確定SQL Server交易管理模型會正確執行,請避免使用其他交易管理模型,例如SQL Server所提供的模型。
注意
認可或回復交易之後,交易的隔離等級會針對處於自動認可模式的所有後續命令保存, (SQL Server預設) 。 這會產生非預期的結果,例如 REPEATABLE READ 的隔離等級,並將其他使用者鎖定在資料列之外。 若要將隔離等級重設為預設 (READ COMMITTED) ,請執行 Transact-SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED 語句,或立即呼叫 SqlConnection.BeginTransaction ,後面接著 SqlTransaction.Commit 。 如需有關SQL Server隔離等級的詳細資訊,請參閱交易隔離等級。
如需SQL Server交易的詳細資訊,請參閱Transact-SQL (交易) 。
注意
當您的查詢傳回大量資料和呼叫 BeginTransaction
時,會擲回 , SqlException 因為使用 MARS 時,SQL Server不允許平行交易。 若要避免這個問題,請在開啟任何讀取器之前,一律將交易與命令、連接或兩者產生關聯。