在C#.NET2.0中处理事务的最佳实践是什么.应该使用哪些类?需要注意的trap 是什么,等等.所有提交和回滚的东西.我刚刚开始一个项目,在该项目中,我可能需要在将数据插入数据库时执行一些事务.欢迎任何关于交易的基本信息的回复或链接.
在C#.NET2.0中处理事务的最佳实践是什么.应该使用哪些类?需要注意的trap 是什么,等等.所有提交和回滚的东西.我刚刚开始一个项目,在该项目中,我可能需要在将数据插入数据库时执行一些事务.欢迎任何关于交易的基本信息的回复或链接.
有两种主要的交易类型;连接事务和环境事务.连接事务(比如SqlTransaction)直接绑定到db连接(比如SqlConnection),这意味着必须不断传递连接——在某些情况下是可以的,但不允许"创建/使用/发布"使用,也不允许跨db工作.示例(格式为空格):
using (IDbTransaction tran = conn.BeginTransaction()) {
try {
// your code
tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
不是太乱,但仅限于我们的连接"Conn".如果我们想调用不同的方法,我们现在需要传递"conn".
另一种 Select 是环境事务;新来的.NET 2.0,TransactionScope对象(System.Transactions.dll)允许在一系列操作中使用(合适的提供程序将自动在环境事务中登记).这使得它很容易恢复到现有(非事务性)代码中,并与多个Provider 交谈(尽管如果您与多个Provider 交谈,DTC将参与其中).
例如:
using(TransactionScope tran = new TransactionScope()) {
CallAMethodThatDoesSomeWork();
CallAMethodThatDoesSomeMoreWork();
tran.Complete();
}
请注意,这两个方法可以处理它们自己的连接(open/use/close/dispose),但它们将悄悄地成为环境事务的一部分,而无需我们传入任何内容.
如果您的代码出错,将调用Dispose()而不调用Complete(),因此它将被回滚.支持预期的嵌套ETC,尽管您不能回滚内部事务,也不能完成外部事务:如果任何人不满意,事务就会中止.
TransactionScope的另一个优点是,它不仅与数据库相关;任何事务感知Provider 都可以使用它.比如WCF.甚至还有一些TransactionScope兼容的对象模型(例如,具有回滚功能的NET类——可能比memento更容易,尽管我自己从未使用过这种方法).
总而言之,这是一个非常非常有用的东西.
一些注意事项: