transactions - 如何使用 Dapper 跨多个方法调用使用事务?
问题描述
我需要包装一些对正在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
操作吗?如果是这样,我会从方法中传回什么来指示成功或失败?
解决方案
您可以在每个方法调用中将连接/事务作为参数注入。
以下是一种伪代码(语法可能不准确):
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。但是,仅当您在更广泛的层面上实施它时才值得。
推荐阅读
- groovy - (Groovy) 查找所有包含特定用户组的 Confluence 空间
- hashicorp-vault - Vault 数据库机密引擎忽略非默认端口
- powershell - 在 foreach 中使用演员表
- javascript - 在 Wkwebview Cordova ios 14 中打开 Websql 数据库
- pyspark - 在pyspark中,Alteryx右外自连接等于什么?
- angular - 将焦点放在 p-inputNumber
- javascript - 如何使用 Javascript 将表格行链接到外部 URL?
- linux - Docker 镜像导入错误:“基础层不能有墓碑”
- html - 用户可定制的 Web 应用程序
- google-cloud-platform - GCP 中的问候问题 apigee 配置