如何在 Dapper.NET 中使用事务?
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在 Dapper.NET 中使用事务?相关的知识,希望对你有一定的参考价值。
咨询区
Amit:
我的项目中使用 dapper.net 做数据库连接框架,有一个需求需要在多个表上执行多次插入操作,我想把它 事务化
,但我看 dapper 并没有提供类似的方式。
请问我该如何使用 dapper 来做这项工作呢?
回答区
Newteq Developer
如果用 Dapper 实现事务功能,大概有三种实现方式。
简单的事务方法
这种事务方式很原始,就是在已存在的 Connection 上创建 Transaction, 然后将事务作为参数传递到 Execute 方法中,当业务逻辑处理完后,再做 commit 提交,参考如下代码:
string sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
connection.Execute(sql, new {CustomerName = "Mark"}, transaction: transaction);
connection.Execute(sql, new {CustomerName = "Sam"}, transaction: transaction);
connection.Execute(sql, new {CustomerName = "John"}, transaction: transaction);
transaction.Commit();
}
}
使用 TransactionScope
如果你喜欢用 TransactionScope 方式,有一点要注意,那就是需要在 connection 创建之前创建 Scope,然后在 Scope 作用域内做你想做的sql操作,最后执行一个 complete 提交即可,参考如下代码:
using (var transaction = new TransactionScope())
{
var sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";
using (var connection = My.ConnectionFactory())
{
connection.Open();
connection.Execute(sql, new {CustomerName = "Mark"});
connection.Execute(sql, new {CustomerName = "Sam"});
connection.Execute(sql, new {CustomerName = "John"});
}
transaction.Complete();
}
使用 Dapper Transaction 方式
这是使用 Dapper 最推荐的方式,毕竟它的代码语义太强了,你可以直接在 new 出的 Transaction 之上执行各自的sql语句,参考如下代码:
string sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
transaction.Execute(sql, new {CustomerName = "Mark"});
transaction.Execute(sql, new {CustomerName = "Sam"});
transaction.Execute(sql, new {CustomerName = "John"});
transaction.Commit();
}
}
点评区
说实话,这三种方式总结的特别好,但有一点看着很不爽,那就是在执行 Transaction 之前需要 connection.Open()
,有点繁琐,所以这一块还是可以再封装一下的。
以上是关于如何在 Dapper.NET 中使用事务?的主要内容,如果未能解决你的问题,请参考以下文章
dapper.net,如何刷新 ConcurrentDictionary?