在c#项目中同时锁定和使用SQL Server 2008表?

在c#项目中同时锁定和使用SQL Server 2008表?,c#,sql-server,sql-server-2008,locking,deadlock,C#,Sql Server,Sql Server 2008,Locking,Deadlock,我有一个SQL Server表,该表将由批处理作业使用backgroundworker多线程调用每5分钟更新一次。当我通过批处理作业插入表时,我也使用线程锁。应用程序的用户可以同时访问相同的数据。我的业务逻辑是C语言。对于这一点,最佳和优化的解决方案是什么?我是否可以在这种情况下使用线程锁?您有什么问题(或您预期的问题) SQL Server是为处理大量并发连接和用户更新、插入、读取数据而制作和优化的。让它来处理工作吧 当后台工作线程更新表时,它将对更新的行执行独占(X)锁定,但只对这些行执行锁

我有一个SQL Server表,该表将由批处理作业使用backgroundworker多线程调用每5分钟更新一次。当我通过批处理作业插入表时,我也使用线程锁。应用程序的用户可以同时访问相同的数据。我的业务逻辑是C语言。对于这一点,最佳和优化的解决方案是什么?我是否可以在这种情况下使用线程锁?

您有什么问题(或您预期的问题)

SQL Server是为处理大量并发连接和用户更新、插入、读取数据而制作和优化的。让它来处理工作吧

当后台工作线程更新表时,它将对更新的行执行独占(X)锁定,但只对这些行执行锁定(只要一次更新的行数不超过5000行)

在此期间,可以读取表中的任何其他行—根本没有问题,也看不到死锁

如果在一个事务中更新的行数超过5000行,则可能会出现此问题—SQL Server将执行锁升级以避免跟踪过多的锁,并使用(X)锁锁定整个表。在该更新事务结束之前-不再可能进行读取-但这些是正常的事务锁-不是死锁


那么你的问题在哪里

让SQL Server来处理这个问题——这就是它的用途!请尽量避免在一次批处理运行中更新超过5000行-否则,整个表可能会被放置一个排他锁,在释放该(X)锁之前,无法再读取数据。我正在通过批处理作业sql更新的线程执行显式锁。这是必需的还是sql将处理此问题?私有对象thisLock=新对象();lock(thisLock){}这只是.NET锁定-与数据库无关,对数据库也没有任何影响!我正在通过线程为批处理作业sql更新执行一些显式锁定。这是必需的还是sql将处理此问题?私有对象thisLock=新对象();lock(thisLock){}@SelvakumarM.M:SQLServer会自动处理所有这些-我会尽量避免执行任何显式锁定,除非您绝对必须。。。。