事务是组合成逻辑工作单元的数据库作组,用于控制和维护每个数据库的一致性和完整性,尽管系统中可能发生错误。 事务由一系列 SQL SELECT、INSERT、UPDATE 或 DELETE 语句组成。 如果在事务期间未发生任何错误,则事务中的所有修改都将成为数据库的永久部分。 如果发生错误,则不会对数据库进行任何修改。
如果事务是单阶段事务,并且由数据库直接处理,则属于本地事务。 当事务监视器协调事务并使用故障安全机制(如两阶段提交)进行事务解析时,事务被视为分布式事务。
注释
事务在服务器上执行时最为有效。 如果您正在使用一个大量使用显式事务的 SQL Server 数据库,应该考虑使用 Transact-SQL BEGIN TRANSACTION 语句,将事务编写为存储过程。
使用MsDb2Connection
对象来控制交易。 可以使用 BeginTransaction
方法启动本地事务。 一旦开始事务,可以使用 Transaction
对象的属性在该事务中登记命令 MsDb2Command
。 然后,可以根据事务组件的成功或失败,提交或回滚在数据源上进行的修改。
事务有三个基本命令:BEGIN、COMMIT 和 ROLLBACK。 BEGIN 语句标记事务的开头。 在 BEGIN 语句后尝试的所有过程都被视为事务的一部分,该事务由 COMMIT 语句完成,或者由 ROLLBACK 语句取消。
执行事务
调用
MsDb2Connection.BeginTransaction
以标记事务的开始。BeginTransaction
返回对事务的引用。 保留此引用,以便你可以将其分配给事务中登记的命令。将事务分配给
MsDb2Command.Transaction
执行。在带有活动事务的连接上如果执行命令,并且
Transaction
对象尚未分配给Command
对象的Transaction
属性,则会引发一个MsDb2Exception
异常。执行所需的命令。
调用
MsDb2Transaction.Commit
以完成事务,或调用MsDb2Transaction.Rollback
取消事务。如果在
Commit
或Rollback
方法执行之前连接关闭或断开,事务将回滚。下面的代码示例演示如何执行事务。
static void TransactionConnection()
{
MsDb2Connection myConnection new MsDb2Connection(@"file name=HOST.udl ");
myConnection.Open();
// Start a local transaction.
MsDb2Transaction myTrans = myConnection.BeginTransaction();
// Enlist the command in the current transaction.
MsDb2Command myCommand = myConnection.CreateCommand();
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Both records are written to database.");
}
catch(Exception e)
{
try
{
myTrans.Rollback();
}
catch (MsDb2Exception ex)
{
if (myTrans.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.");
}
finally
{
Console.ReadLine();
myConnection.Close();
}
}
// End TransactionConnection