【发布时间】:2013-12-02 13:49:37
【问题描述】:
我有一些使用 SQLServer 2008rc2 的 Ruby on Rails 代码,但遇到了死锁问题。 从 SQL 的角度来看,这就是我的代码的样子:
begin transaction
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
select * from table1 with (rowlock, updlock) where id = 1234 -- fetch the object with a lock
-- do several queries, all with nolock or no hint
-- this can take a few seconds
update table1 with(rowlock) set x = 'y' where id = 1234
end
这发生在网络服务器上,因此有时同时有 2 个事务。这里的问题是,有时对 2 个非常不同的 id 的 2 个请求会陷入僵局。
起初没有提示,也没有设置事务隔离。我认为这是造成问题的页锁,所以我添加了 ROWLOCK 并 READ UNCOMMITED。然后我发现了一个关于在 SHARED 事务中进行更新的问题,所以我使用了 UPDLOCK。现在我的想法已经不多了。
大家是不是觉得很熟悉?
【问题讨论】:
-
读取未提交,然后是行锁、上锁。真的吗?
-
AFAIK 隔离级别定义了事务的默认值,并且可以使用提示进行更改。那里有 40 个请求,其中未提交的读取是正确的级别。也就是说,我更习惯于 postgres,所有这些 SQLServer 锁和提示对我来说都非常神秘。
-
“像 40 个请求,其中未提交的读取是适当的级别” - 我唯一使用未提交的读取是报告绝对一致性不是最重要的查询。
-
也许...我只是按照我们数据库管理员的指示进行操作。正如我所说,我试图了解这些事情是如何运作的。
-
也许您的 DBAdmin 实际上并不知道他们在做什么?只是一个想法……它确实发生了……
标签: ruby-on-rails sql-server sql-server-2008 transactions deadlock