Как использовать транзакцию через несколько вызовов методов с Dapper? - PullRequest
1 голос
/ 18 февраля 2020

Мне нужно обернуть некоторые вызовы методов, которые делают 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? Если это так, что бы я вернулся от метода, чтобы указать на успех или неудачу?

1 Ответ

0 голосов
/ 19 февраля 2020

Вы можете внедрить соединение / транзакцию в каждом вызове метода в качестве параметра.

Ниже приведен вид псевдокода (синтаксис может быть неточным):

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
    }
}

Лучшее решение - использовать Единица работы . Но это того стоит, если вы реализуете его на более широком уровне.

...