使用TransactionScope()进行事务管理
本文关键字:事务管理 TransactionScope 使用 | 更新日期: 2023-09-27 18:03:30
我需要创建一个简单的dotnet应用程序,它将在循环中调用存储过程(存储过程接受几个参数并将它们添加到表中)。要求要么插入所有行,要么不插入。
为了确保这一点,我使用了:
using (TransactionScope scope = new TransactionScope())
{
foreach (EditedRule editedRules in request.EditedRules)
{
...stored procedure call
}
}
我从来没有使用过TransactionScope
之前,有人可以让我知道如果这个代码将工作,将我所有的行回滚。
如果有更好的方法我也会很感激。
假设你的存储过程不创建和提交自己的事务,这段代码将工作,有一个变化:你的代码需要在using
块结束之前编码scope.Complete()
;否则,事务将回滚。
using (TransactionScope scope = new TransactionScope()) {
foreach (EditedRule editedRules in request.EditedRules) {
...stored procedure call
}
scope.Complete(); // <<== Add this line
}
这个构造背后的思想是Complete
的调用只会在块正常退出时发生,即在处理循环时没有异常。如果抛出异常,scope
将检测到它,并导致事务回滚。
关于你的代码,我想说的唯一一件事是确保做一个scope.Complete()
,以便提交事务:
using (TransactionScope scope = new TransactionScope())
{
foreach (EditedRule editedRules in request.EditedRules)
{
// stored proc
}
scope.Complete();
}
如果在using块中出现任何异常,事务将被回滚。
我想这就是你要找的:
using (var transaction = conn.BeginTransaction()) {
try
{
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}