Foxtable(狐表)用户栏目专家坐堂 → [分享]<结贴>异步不能用狐表自带的事务,使用OleDb原生事务,解决异步comit线程干扰报错:如果分配给命令的连接位于本地挂起事务中,ExecuteNonQuery 要求命令拥有事务。命令的 Transaction 属性尚未初始化。


  共有4419人关注过本帖平板打印复制链接

主题:[分享]<结贴>异步不能用狐表自带的事务,使用OleDb原生事务,解决异步comit线程干扰报错:如果分配给命令的连接位于本地挂起事务中,ExecuteNonQuery 要求命令拥有事务。命令的 Transaction 属性尚未初始化。

帅哥哟,离线,有人找我吗?
chen37280600
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1265 积分:7844 威望:0 精华:4 注册:2017/12/31 14:53:00
[分享]异步不能用狐表自带的事务,使用OleDb原生事务,解决异步comit线程干扰报错:如果分配给命令的连接位于本地挂起事务中,ExecuteNonQuery 要求命令拥有事务。命令的 Transaction 属性尚未初始化。  发帖心情 Post By:2020/5/5 22:52:00 [只看该作者]

狐表在20210529后的版本已增加可以异步使用的Sql事务,这个帖子的方法不再需要了。但是可以留作研究OleDb独立事务

=============================================
我的bs里,有些方法有事务,一般用于入库单和出库单,涉及到多表的批量插入,因此按照官方文档,开了事务。这些事务,由于要插入的行和修改的表都比较多,耗时较长,都启动了异步。

于是今天出现一个:
2020-05-05 10:45:54.7266
报错定位:
如果分配给命令的连接位于本地挂起事务中,ExecuteNonQuery 要求命令拥有事务。命令的 Transaction 属性尚未初始化。
   在 System.Data.OleDb.OleDbConnectionInternal.ValidateTransaction(OleDbTransaction transaction, String method)
   在 System.Data.OleDb.OleDbConnection.ValidateTransaction(OleDbTransaction transaction, String method)
   在 System.Data.OleDb.OleDbCommand.ValidateConnectionAndTransaction(String method)
   在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
   在 System.Data.Common.DbDataAdapter.UpdateRowExecute(RowUpdatedEventArgs rowUpdatedEvent, IDbCommand dataCommand, StatementType cmdIndex)
   在 System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)


按照事务的代码:
Try
    Connections("数据源").BeginTransaction()
'开始事务
    Dim cmd As new
SQLCommand
    cmd.ConnectionName =
"数据源"
    cmd.CommandText =
"Del ete From {订单} Where [订单编号] = 32"
    cmd.
ExecuteNonQuery
    cmd.CommandText =
"Del ete From {订单明细} Where [订单编号] = 32"
    cmd.
ExecuteNonQuery
    Connections("数据源").Commit
'提交事务,所有操作生效

Catch
ex As Exception '如果出错
    Connections("数据源").Rollback()
'回滚事务,撤销所有操作

End
Try

我在感觉,异步多线程下,Connections("数据源")是存在线程干扰,这个东西并不是new出来的,而且在狐表启动后,外部数据源里初始化好的。多个线程共用一个Connections("数据源"),

场景1:
A线程把事务Begin,
B线程刚好到把事务Commit
A线程才开始插入数据,于是就报错了

场景2:
A线程把事务Begin,
A线程对事务配置了待执行的插入代码
B线程刚好到把事务Commit,由B来帮A线程Commit
A线程继续对事务配置剩下待执行的插入代码,已经出问题了

我个人感觉会有问题,这个问题貌似需要狐爸的资深用户解答


我去百度了一个mysql里事务和多线程,貌似跟我说的一样

那BS里怎么解决耗时较久的写入问题?

[此贴子已经被作者于2022/1/14 10:44:09编辑过]

 回到顶部