事务操作的嵌套事务范围

本文关键字:范围 嵌套事务 操作 事务 | 更新日期: 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"或类似的东西,这是有道理的:如果嵌套作用域决定事务无法提交,则外部作用域应该无法提交它。