事务操作的嵌套事务范围
本文关键字:范围 嵌套事务 操作 事务 | 更新日期: 2023-09-27 18:35:53
我对事务范围有疑问,因为我想做一个事务操作,首先我执行一些 CRUD 操作(在数据库上插入和更新某些行的事务),然后我从整个事务(XML)中得到结果。
获得 XML 后,我将 XML 发送到我的客户公开的 Web 服务以与我的系统集成。
关键是,让我们想象一下,有一天,我的客户公开的 WS 由于其 IT 领域执行的每周或每月支持任务而出现故障,因此我每时每刻都会执行整个操作它执行数据库操作,但当然它会在我尝试调用 WS 的那一刻引发异常。
在互联网上搜索后,我开始考虑事务范围。我的数据访问层上的数据访问方法已经有一个事务范围,我可以在其中执行插入、更新、删除等操作。
我想尝试以下代码:
public void ProcessSomething()
{
using (TransactionScope mainScope = new TransactionScope())
{
FooDAL dl = new FooDAL();
string message = dl.ProcessTransaction();
WSClientFoo client = new WSClientFoo();
client.SendTransactionMessage(message);
mainScope.Complete();
}
}
public class FooDAL
{
public string ProcessTransaction()
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions(){ IsolationLevel = IsolationLevel.ReadCommitted}))
{
///Do Insert, Update, Delete and According to the Operation Generates a message
scope.Complete();
}
return transactionMessage;
}
}
问题是,使用事务范围来处理我想做的事情是否正确?
非常感谢您的时间:)
FooDAL.ProcessTransaction 方法中的TransactionScopeOption.Required
实际上意味着:如果有可用的事务,则在此范围内重用它;否则,创建一个新事务。
简而言之:是的,这是正确的方法。
但请注意,如果您不调用范围。在 FooDAL.ProcessTransaction 中,对 mainScope.Complete() 的调用将崩溃并显示"TransactionAbortedException"或类似的东西,这是有道理的:如果嵌套作用域决定事务无法提交,则外部作用域应该无法提交它。