Dapper.net 交易问题

Posted

技术标签:

【中文标题】Dapper.net 交易问题【英文标题】:Dapper.net transaction problem 【发布时间】:2011-07-31 19:46:18 【问题描述】:

我正在尝试向我的 Sql Server 2008 数据库提交一个事务 - 首先是 2 个插入,然后是几个更新,但是,一旦它尝试执行第一个更新,我就会收到以下错误:

ExecuteNonQuery 要求命令有一个事务,当 分配给命令的连接处于挂起的本地事务中。 该命令的 Transaction 属性尚未初始化。

代码如下,为简洁起见略作编辑:

using (_cn)

    _cn.Open();
    IDbTransaction transaction = _cn.BeginTransaction();
    topicId = (int)_cn.Query<decimal>(qAddTopic, new  pForumId = topic.ForumId , transaction).Single();
    postId = (int)_cn.Query<decimal>(qAddPost, new  pTopicId = topicId , transaction).Single();

    _cn.Execute(qUpdateForums, new  pLastPostId = postId );
    _cn.Execute((qUpdateSiteTotals));

    transaction.Commit();

前 2 个插入工作正常,但一旦它尝试执行其中一个更新,就没有乐趣了。

【问题讨论】:

【参考方案1】:

我发现了问题 - 我只是在调用更新时丢失了事务参数,而之前的插入工作正常,我已经包含了 IDbTransaction 参数!我的错!

例子:

Connection.Query<Entitiy>("sqlQuery",param: new  id= ID, transaction: Transaction)

【讨论】:

Connection.Query&lt;Entitiy&gt;("sqlQuery",param: new id= ID, transaction: Transaction) 如果你的查询没有使用任何参数(比如,select * from table),如果你只是传递了transaction,dapper 会将它解释为一个参数对象。所以上面使用命名可选参数的语法将防止这种情况发生。 谢谢@KemuelSanchez。我想知道发生了什么,但这解释了它! 我用过commandDefinition,所以用下面的。 CommandDefinition command = new CommandDefinition(storedProcedureName, dynamicParameters, commandTimeout: commandTimeout, commandType: commandType, transaction: _dbTransaction);【参考方案2】:

Microsoft 建议尽可能在数据库 IDbTransaction 上使用 TransactionScope。下面的代码应该可以工作,假设您的 SQL 没有任何问题,并且托管提供程序自动加入环境事务 - 这是表现良好的提供程序需要做的事情。

using (var ts = new TransactionScope())

  using (_cn)
  
    _cn.Open();
    ...
  

  ts.complete();

【讨论】:

感谢奥利弗的回复。不幸的是,看起来 Dapper.net 不支持 TransactionScope,只支持 IDbTransaction :( @marcusstarnes 你确定吗?它应该工作。只是不要使用 BeginTransaction 和 Commit。 transactionScope 将处理休息 Dapper 对交易完全不可知。我将 TransactionScope 与 Dapper 结合使用,绝对零问题。 这是因为 TransactionScope 在设计上会自动影响所有连接。并不是说 Dapper 有特定于交易的东西。 这在与 dapper 一起使用时会带来自身的错误 - 不支持在环境事务中登记(2019 年 2 月)。

以上是关于Dapper.net 交易问题的主要内容,如果未能解决你的问题,请参考以下文章

dapper.net,如何刷新 ConcurrentDictionary?

如果交易 ID 发生变化,如何识别格子交易

在 Dapper.NET 中调整 CommandTimeout?

Dapper.net 十进制输出参数不返回精度值

用于自定义交易的 Netsuite 交易摘要框

BEP-20 代币交易中被低估的交易