在我的c#项目中,我在MARS模式下有一个SQL连接,多个线程正在使用它来执行CRUD操作。其中一些操作需要作为事务执行。在我完成数据访问模块之后,我开始测试并从其中一个选项中获得InvalidOperationException,声明由于连接具有活动事务,因此选择本身需要在事务中。窥探MSDN我发现了以下内容:
警告:当您的查询返回大量数据并调用BeginTransaction时,会抛出SqlException,因为SQL Server在使用MARS时不允许并行事务。要避免此问题,请始终在任何读者打开之前将事务与命令,连接或两者相关联。
我可以轻松创建一个将命令聚合到事务中的方法,这甚至可以让我有一个定时器线程定期提交事务,但这是正确的方法吗?我应该在提交活动事务之前暂停不需要事务的命令吗?
答案 0 :(得分:0)
我会远离MARS。
请参阅:
由多个线程用于执行CRUD操作
这尖叫"每个线程一个连接,它自己的交易"除非你在这里有一个非常罕见的案例。这绝对不是MARS的有效用例。