如何在 Dapper.NET 中使用事务?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在 Dapper.NET 中使用事务?相关的知识,希望对你有一定的参考价值。

咨询区

  • Amit

我的项目中使用 dapper.net 做数据库连接框架,有一个需求需要在多个表上执行多次插入操作,我想把它 事务化,但我看 dapper 并没有提供类似的方式。

请问我该如何使用 dapper 来做这项工作呢?

回答区

  • Newteq Developer

如果用 Dapper 实现事务功能,大概有三种实现方式。

  1. 简单的事务方法

这种事务方式很原始,就是在已存在的 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();
    }
}
  1. 使用 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();
}
  1. 使用 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 将 C# 列表插入数据库

如何在Dapper.Net中编写一对多查询?

dapper.net,如何刷新 ConcurrentDictionary?

使用Dapper.NET异步API时如何尊重CommandTimeout

dapper.net 转载

在 Dapper.NET 中调整 CommandTimeout?