我有一个多线程C#2.0应用程序,其中每个线程将一些结果写入SQL Server 2000数据库表。只有一个直接的INSERT命令而没有其他逻辑。
我的问题是 - 我是否需要锁定将结果写入数据库的方法?目前有一个锁,但我怀疑它正在减慢应用程序的速度。
谢谢!
答案 0 :(得分:5)
如前所述“SqlConnection不是线程安全的”。
在您的应用程序中尝试打开一次连接,MS SQL Server有内部锁定以防止数据丢失,因此您不必担心。
答案 1 :(得分:2)
不,您不需要任何锁定,但需要为每个插入创建一个新的SqlConnection
。文档说明SqlConnection
的实例成员不是线程安全的。
Edit2:在这种情况下,通过不线程安全意味着您不能在多个线程之间共享一个SqlConnection
。但是如果每个线程都有自己的SqlConnection
,那么插入是可以的。数据库本身遵循ACID属性,因此尝试插入数据的并发连接是安全且定义良好的。
编辑但是,如果您无法弄清楚为什么它首先以这种方式编写,那么在删除奇怪的代码时应该小心。它很容易产生某种副作用,通过查看数据库代码来解决这个问题是非常重要的。但另一方面,如果代码是由粘贴了通过Google发现的随机代码的人编写的,那么最好的办法就是重写代码。
答案 2 :(得分:0)
由于我们讨论的是MS SQL Server,我认为他们有内部锁定来防止数据损坏。大多数现代DBMS都会这样做,否则会遇到大麻烦。