使用事务的目的是什么?
保证事务范围内的代码,要么全部执行,要么全不执行,也就是出错回滚。
写在数据库脚本里很好理解,但是用在应用程序层面,没有看到catcha error rallback的代码,心里还是不踏实:
1、应用程序层面使用TransactionScope,在Scope范围内没有catch error并回滚的代码,所以想知道如果在Complete之前出错,会是什么情况?
本人设置了应用程序层面的报错,报错前后都有数据库操作,执行结果: 事务自动回滚
本人设置了数据库脚本层面报错,执行结果:自动回滚
2、在程序编码中我们仍然需要知道事物是否成功执行,实现方案是在scope外部try catch(TransactionAbortedException ex)
以下是标准语法
try
{
using (TransactionScope scope = new TransactionScope())
{
// Do Operation 1
// Do Operation 2
//...
// 如果所有的操作都执行成功,则Complete()会被调用来提交事务
// 如果发生异常,则不会调用它并回滚事务
scope.Complete();
}
}
catch (TransactionAbortedException ex) {
//异常处理
writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
}
总结:
在Complete()之前,无论是出现程序级别的错误,还是数据库级别的错误,事物都会回滚。不需要写rollback,而这些是通过框架处理的。
通过监测数据库正在执行的事务,可以观察事务在代码运行过程中的状态
查看active transaction 的sql
select * from sys.dm_tran_session_transactions
官方文档:
TransactionScope 类 (System.Transactions) | Microsoft Docs
更详细更深入的用法,点击链接:
https://www.cnblogs.com/yilezhu/p/10170712.html
本文来自博客园,作者:jiayouliucui,转载请注明原文链接:https://www.cnblogs.com/cheery-go/p/15608322.html