【问题标题】:How to use transaction across multiple method calls with Dapper?如何使用 Dapper 跨多个方法调用使用事务?
【发布时间】:2020-06-02 20:28:14
【问题描述】:

我需要包装一些对正在执行async 更新和插入到我的数据库中的方法的调用。所有方法都使用这种模式来运行代码:

 using (IDbConnection conn = Connection)
            {
                conn.Open();
                //TODO:  Table item quantity for the QTYALLOC field
                var sql = //sql statement;
                int x = await conn.ExecuteAsync(sql);
                return x > 0;
            }

现在所有的方法都返回一个boolean。我想将调用包装在事务中并提交或回滚

                    await [InsertRecord];
                    //add the audit record
                    var addAudit = await [Insert Audit Record];
                    var updateOrd = await [Update Record]
                    var changePickStatus = await [Update Record]
                    if (locs.First().QTYTOTAL - ord.QTYPICKED <= 0)
                    {
                        await [Delete Record]; //delete the record

                    }
                    else
                    {
                        //decrement the quantity for the location and update.
                        locs.First().QTYTOTAL -= ord.QTYPICKED;
                        await [Update Record]

                    }

我把对方法的调用放在方括号 [] 中。现在每个调用都会返回一个boolean 来指示它是成功还是失败,我想将所有这些调用包装在一个事务中,以根据每个调用的结果提交或回滚。如果可以的话,我不想把所有的 SQL 语句都放在一个大的调用中,它们又长又复杂。我可以将事务传递给每个方法调用并将其应用于每个ExecuteAsync 操作吗?如果是这样,我会从方法中传回什么来指示成功或失败?

【问题讨论】:

    标签: transactions dapper


    【解决方案1】:

    您可以在每个方法调用中注入连接/事务作为参数。

    以下是一种伪代码(语法可能不准确):

    using (IDbConnection conn = Connection)
    {
        using(var transaction = conn.BeginTransaction())//Begin here
        {
            var addAudit = await [YourMethod(conn)];//Inject as parameter
            if(addAudit == false)
                transaction.Rollback();//Rollback if method call failed
            ...
            ...
            //Repeat same pattern for all method calls
            ...
            transaction.Commit();//Commit when all methods returned success
        }
    }
    

    更好的解决方案是使用Unit Of Work。但是,仅当您在更广泛的层面上实施它时才值得这样做。

    【讨论】:

    • 我使用了一个连接然后打开它,将事务添加到打开的连接中,并将连接和事务传递到每个方法中。它似乎正在工作,但需要进行更多测试以确保其成功。谢谢。
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2018-01-26
    • 2015-02-28
    • 2020-02-07
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多