我需要创建一个简单的 dotnet 应用程序,它将在循环中调用存储过程(存储过程接受少量参数并将它们添加到表中)。要求是所有行都被插入或不插入。
为了确保这一点,我使用了:
using (TransactionScope scope = new TransactionScope())
{
foreach (EditedRule editedRules in request.EditedRules)
{
...stored procedure call
}
}
我以前从未使用过 TransactionScope
,有人可以告诉我这段代码是否有效,我的所有行是否会回滚。
如果有更好的方法,我也将不胜感激。
最佳答案
假设您的存储过程不创建和提交它自己的事务,此代码可以工作,只需做一个更改:您的代码需要编码 scope.Complete()
在 using
block 结束之前;否则,事务将回滚。
using (TransactionScope scope = new TransactionScope()) {
foreach (EditedRule editedRules in request.EditedRules) {
...stored procedure call
}
scope.Complete(); // <<== Add this line
}
这个构造背后的想法是,Complete
的调用只有在 block 正常退出时才会发生,即处理循环时没有异常。如果抛出异常,scope
会检测到它,并导致事务回滚。
关于c# - 事务管理使用TransactionScope(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31517441/