TransactionScope数据库事务处理
.Net访问数据库事务处理,大家首先想到是SqlTransaction
。但在使用过程中你会发现其缺点:
- 事务只能位于一个逻辑块下,(不能将多个函数:执行sql放置在一个事务中)
- 不能用于两个多个数据库间事务处理
TranscationScope
TranscationScope
很好地解决了上述问题,先看怎么使用:
添加程序集System.Transactions
再看一种提倡的代码结构
public void ExecSQL()
{
using(TransactionScope tran = new TransactionScope())
{
//执行第一个数据库命令
using(SqlConnection con1 = new SqlConnection("connectionString1"))
{
SqlCommand cmd = new SqlCommand("update", con1);
con1.Open();
cmd.ExecuteNonQuery();
}
//执行第二个数据库命令(可以连接不同的库)
using (SqlConnection con2 = new SqlConnection("connectionString2"))
{
SqlCommand cmd = new SqlCommand("update", con2);
con2.Open();
cmd.ExecuteNonQuery();
}
//事件操作代码
tran.Complete();
}
}
事务嵌套的处理
创建事务TransactionScope
可以选择TransactionScopeOption
类型参数。
TransactionScopeOption
枚举类型由三种指分别为:
Required
如果已经存在环境事务,则使用该环境事务。否则,在进入范围之前创建新的事务(事务嵌套时,可利用环境的事务)RequiresNew
总是创建新的事务Suppress
事务取消时会保留其内的操作,一般用于写入日志,操作执行失败数据回滚但希望写入日志错误信息。