1
33
最近我有一个 deadlock problem 因为SQL Server锁定的次数比必需的多(第页)。你不能做任何反对它的事情。现在我们正在捕获死锁异常…我希望我能换成先知。 编辑: 同时,我们使用快照隔离,这解决了许多问题,但并不是所有的问题。不幸的是,为了能够使用快照隔离,数据库服务器必须允许使用快照隔离,这可能会导致客户站点出现不必要的问题。现在,我们不仅捕获死锁异常(当然仍然可能发生),而且还捕获并发问题,以便从后台进程(用户不能重复)重复事务。但这仍然比以前好得多。 |
2
17
我也有类似的问题,我只想锁定一行。
据我所知,
A请注意,您有一个名为tbl的表,
然后,只锁定所读取行的查询是:
如果不使用index(tblindex)选项,则sqlserver需要从表的开头读取所有行,以查找包含
|
3
7
不能同时进行快照隔离和阻塞读取。快照隔离的目的是 防止 阻塞读取。 |
4
5
尝试(向上锁定,行锁定) |
5
5
完整的答案可以深入研究DBMS的内部。这取决于查询引擎(它执行由SQL优化器生成的查询计划)的运行方式。
但是,一个可能的解释(至少适用于某些DBMS的某些版本-不一定适用于MS SQL Server)是,ID列上没有索引,因此任何试图使用'
有一些方法可以揭穿这是麻烦的根源。查看查询计划;研究索引;尝试选择ID为1000000而不是1的,看看其他进程是否仍然被阻塞。 |
6
5
也许让MVCC永久化可以解决这个问题(与仅特定批处理相反:设置事务隔离级别快照):
[编辑:10月14日] 读完后: Better concurrency in Oracle than SQL Server? 而这: http://msdn.microsoft.com/en-us/library/ms175095.aspx
我得出的结论是,您需要设置两个标志,以便在给定的数据库上永久激活MSSQL的MVCC:
|
7
3
好的,默认情况下,单个select将使用“read committed”事务隔离,该隔离锁定并因此停止对该集的写入。您可以使用更改事务隔离级别
这些在SQL Server BOL中进行了详细说明。 您的下一个问题是,默认情况下,如果您在锁事务中拥有超过2500个锁或使用超过40%的“正常”内存,SQL Server 2K5将升级这些锁。升级到第页,然后是表锁 您可以通过设置“跟踪标志”1211T关闭此升级,有关详细信息,请参阅BOL。 |
8
2
我假设您不希望任何其他会话能够在运行此特定查询时读取行… 在与(xlock,readpass)锁定提示一起使用时,在事务中包装您的select将得到您想要的结果。只需确保其他并发读取没有与(nolock)一起使用。readPast允许其他会话在其他行上执行相同的选择。
|
9
2
应用程序锁是使用自定义粒度滚动您自己的锁的一种方法,同时避免“有用的”锁升级。见 sp_getapplock . |
10
2
创建一个假更新来强制行锁。
如果你不把车锁起来,天知道会怎样。
此后
|
11
1
尝试使用:
这应该使锁成为独占的,并在事务期间保持它。 |
12
1
根据 this article ,解决方案是使用WITH(repeatableread)提示。 |
13
1
重新访问您的所有查询,可能您有一些查询选择不带rowlock/用于更新提示,这些查询来自您选择要更新的表。
免责声明:我上次使用的MSSQL是2000版。 |
14
1
您必须在提交时处理异常并重复事务。 |
15
1
问题-这种情况是否被证明是锁升级的结果(即,如果您使用探查器跟踪锁升级事件,那么这是否确实是导致阻塞的原因)?如果是这样的话,通过在实例级别启用跟踪标志来防止锁升级,有一个完整的解释和(相当极端的)解决方案。见 http://support.microsoft.com/kb/323630 跟踪标志1211 但是,这可能会产生意想不到的副作用。 如果您有意锁定一行并将其长期锁定,那么对事务使用内部锁定机制并不是最佳方法(至少在SQL Server中)。SQL Server中的所有优化都是针对短期事务的—进入、更新、退出。这就是锁升级的原因。 因此,如果目的是长时间“签出”一行,而不是事务性锁定,那么最好使用带有值的列和一个普通的ol'update语句来标记这些行是否已锁定。 |
16
1
我以完全不同的方式解决了rowlock问题。我意识到SQL Server无法以令人满意的方式管理这样的锁。我选择从编程的角度通过使用互斥体来解决这个问题…等待…释放… |
17
0
你试过读过去吗? 当把一张表当作一个队列时,我使用了updlock和readpass。 |
18
0
先对这一行进行简单的更新(而不真正更改任何数据)怎么样?之后,您可以继续执行“已选择要更新的”行。
编辑 :您当然应该在事务中包装它。 编辑2 :另一个解决方案是使用可序列化的隔离级别 |
Community wiki · SQL语法新手 1 年前 |
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |