C#中SqlTransaction与TransactionScope区别
SqlTransaction与TransactionScope好像一样的道理,都是没提交就是回滚。。我基本都用TransactionScope做事务性代码处理块。。没用过...
SqlTransaction与TransactionScope好像一样的道理,都是没提交就是回滚。。我基本都用TransactionScope做事务性代码处理块。。没用过SqlTransaction这个。。请2个都用过的回答下有什么本质上的区别,谢谢!
你说的这些我都知道。。只是这2个具体有哪些差异呢。。 展开
你说的这些我都知道。。只是这2个具体有哪些差异呢。。 展开
2个回答
展开全部
分布式事务处理TransactionScope 和 非分布式事务处理
TransactionScope它的用途是为数据库访问提供了一个“轻量级” 区别于:SqlTransaction 的事物
TransactionScope这个事务自身还封装了多个数据库查询。只要任意一个 SqlCommand 对象引发异常,程序流控制就会跳出 TransactionScope 的 using 语句块,随后,TransactionScope 将自行释放并回滚该事务。由于这段代码使用了 using 语句,所以 SqlConnection 对象和 TransactionScope 对象都将被自动调用Dispose()释放。由此可见,只需添加很少的几行代码,您就可以构建出一个事务模型,这个模型可以对异常进行处理,执行结束后会 自行清理,此外,它还可以对命令的提交或回滚进行管理。
TransactionScope在文档中宣称只在“必要”情况下才提升事务级别(多数据库时才使用分布式事务,如果是同一个数据库,最好使用SqlTransaction),但是事实上不是这样。在TransactionScope内,只要你用不同的SqlConnection对象操作DB一次以上(不管你的目标是不是同一个实例、同一个库),都会提升事务级别到分布式事务。
使用分布式事务注意如下几点
1:确保参与事务的machine开启了分布式事务支持;
2:如果machine开启了防火墙,需要设置msdtc进程为例外;
3:参与事务的machine不能跨域(如果跨域,目前微软还没有确切的解决方案);
4:多数据库时才使用分布式事务,如果是同一个数据库,最好使用SqlTransaction.
大部分都是用SqlTransaction这个类来在程序代码中保证事务性,但是SqlTransaction是与SQL Server数据库相关的类,如果将这个类用在了B层,那么就突破了三层架构的底线了,如果将来换数据库(比如从SQL Server换到Oracle),D层和B层都得重写,所以这样做的局限性很大。
用TransactionScope,这个类是与具体数据库无关的类,用这个类来保证B层的事务性十分可行。
示例:
//// <summary>
/// 发送消息
/// </summary>
/// <param name="sendUserId"></param>
/// <param name="toUser">格式7FFA3AF2-E74B-4174-8403-5010C53E49A7|userName,7FFA3AF2-E74B-4174-8403-5010C53E49A7|userName</param>
/// <param name="content"></param>
/// <param name="sendedStatus">表示已送</param>
/// <returns></returns>
public static int sendMessage(string sendUserId, string toUser, string content, string sendedStatus)
{
int receiveCount = 0;
TransactionOptions transactionOption = new TransactionOptions();
//设置事务隔离级别
transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
// 设置事务超时时间为60秒
transactionOption.Timeout = new TimeSpan(0, 0, 60);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
{
try
{
//在这里实现事务性工作
//发送消息
insertMessage(sendUserId, toUser, content, sendedStatus);
//在接收信息表中插入记录
receiveCount += insertReceiveMessage(userids[0], sendUserId, content, "0");
// 没有错误,提交事务
scope.Complete();
}
catch (Exception ex) {
throw new Exception("发送信息异常,原因:"+ex.Message);
}finally{
//释放资源
scope.Dispose();
}
}
return receiveCount;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询