【发布时间】:2010-03-25 02:57:27
【问题描述】:
我看到的行为看起来像是在数据库本身上设置了 READPAST 提示。
问题:我认为这是不可能的。
我们有表 foo (id int primary key identity, name varchar(50) not null unique);
基本上我有几个线程可以做
id = select id from foo where name = ?
if id == null
insert into foo (name) values (?)
id = select id from foo where name = ?
每个线程负责插入自己的名字(没有两个线程试图同时插入相同的名字)。客户端是java。
READ_COMMITTED_SNAPSHOT 为 ON,事务隔离专门设置为 READ COMMITTED,使用 Connection.setTransactionIsolation( Connection.TRANSACTION_READ_COMMITTED );
症状是,如果一个线程正在插入,另一个线程看不到它的行——即使是在应用程序启动之前提交到数据库的行——并尝试插入,但得到一个重复键异常来自 name 的唯一索引。
在这里给我一根骨头?
【问题讨论】:
-
一些关于打包交易的建议 -- 很抱歉我忘了说明我们正在这样做(通过 Connection#setAutocommit(false))
-
还有一点 - 我们删除 name 的唯一索引,一切正常。 (另外,我们不会得到重复的数据。)但这不可能是真正的解决方案。
标签: sql-server locking