2014-04-03 51 views
0

在我的c#项目中,我有一个MARS模式的SQL连接,多线程正在使用它执行CRUD操作。其中一些操作需要作为交易执行。在我完成数据访问模块之后,我开始测试并从其中一个选择中得到一个InvalidOperationException,声明由于连接有一个活动事务,所以select本身需要处于事务中。各地MSDN窥探我发现下面的话:多线程数据库访问

注意:当你的查询返回大量的数据,并调用的BeginTransaction,则抛出SQLException,因为使用MARS当SQL Server不允许并行事务。为避免此问题,请始终在打开任何阅读器之前将事务与命令,连接或两者关联起来。

我可以很容易地创建一个会集结命令转换事务的方法,这将甚至让我有一个计时器线程固定的间隔提交事务,但是这是正确的方式?我是否应该停止不需要事务的命令,直到提交活动事务为止?

+1

这是Winforms,WPF,Asp.Net? –

+1

SqlConnection不是线程安全的。甚至没有MARS。您可以使用异步IO在单个事务中实现并行性。 – usr

回答

0

我会远离MARS。

参见:

由多个线程用于执行CRUD操作

,除非你在这里有一个非常罕见的情况下尖叫“每一个线程一个连接,它自己的交易”。这绝对不像MARS的有效用例。

+0

我以为我要使用MARS的主要原因正是因为会有多个线程使用相同的连接。如果我使用多个连接,我甚至可能根本不需要MARS。由于我无法控制正在访问我的数据模块的线程,因此我正在考虑使用连接池。 –

+0

没有意识到 - 标准连接字符串会自动集中连接。我不会在非特定用例之外的多线程环境中使用MARS(这几乎都是只读的)。吻。 – TomTom