如何使用交易与dapper.net?(How to use transactions with da

2019-06-24 01:22发布

我想运行在多个表上多重插入语句。 我使用dapper.net。 我看不出有任何的方式来处理与dapper.net交易。

请分享你如何使用交易与dapper.net想法。

Answer 1:

下面的代码片段:

using System.Transactions;    
....    
using (var transactionScope = new TransactionScope())
{
    DoYourDapperWork();
    transactionScope.Complete();
}

请注意,您需要添加参考System.Transactions ,因为它默认情况下不引用程序集。



Answer 2:

我更喜欢直接从连接获取事务用更直观的方法:

// This called method will get a connection, and open it if it's not yet open.
using (var connection = GetOpenConnection())
using (var transaction = connection.BeginTransaction())
{
    connection.Execute(
        "INSERT INTO data(Foo, Bar) values (@Foo, @Bar);", listOf5000Items, transaction);
    transaction.Commit();
}


Answer 3:

您应该能够使用TransactionScope因为小巧玲珑的运行只是ADO.NET命令。

using (var scope = new TransactionScope())
{
   // insert
   // insert
   scope.Complete();
}


Answer 4:

考虑到所有的表都在单一的数据库,我不同意TransactionScope在这里的一些答案建议解决方案。 请参考此答案。

  1. TransactionScope通常用于分布式事务; 交易跨越不同的数据库可以是不同的系统上。 这需要操作系统,如果没有这些,这将不起作用SQL Server上的一些配置。 这是不推荐,如果您所有的疑问都对数据库的单个实例。
    但是,与单一的数据库,当你需要在交易的代码,是不是你的控制之下,这可能是有用的。 与单一的数据库,它不需要任何特殊的配置。

  2. connection.BeginTransaction是针对单个数据库ADO.NET语法来实现事务(在C#,VB.NET等)。 这不跨多个数据库工作。

所以, connection.BeginTransaction()是更好的出路。

即使是更好的方式来处理事务,是落实的UnitOfWork在解释这个答案。



Answer 5:

丹尼尔的回答和预期一样对我。 为了完整起见,这里是一个演示提交和使用事务范围和短小精悍回滚一个片段:

using System.Transactions;
    // _sqlConnection has been opened elsewhere in preceeding code 
    using (var transactionScope = new TransactionScope())
    {
        try
        {
            long result = _sqlConnection.ExecuteScalar<long>(sqlString, new {Param1 = 1, Param2 = "string"});

            transactionScope.Complete();
        }
        catch (Exception exception)
        {
            // Logger initialized elsewhere in code
            _logger.Error(exception, $"Error encountered whilst executing  SQL: {sqlString}, Message: {exception.Message}")

            // re-throw to let the caller know
            throw;
        }
    } // This is where Dispose is called 


文章来源: How to use transactions with dapper.net?