2016-09-20 56 views
0

这是我的问题:SqlServer JDBC RowLock

我有一个表中的IDS列表。多个任务同时需要读取一些IDS,使用该ID检索一些其他数据并写入一些文件。 每个任务必须在一组不同的IDS上工作。 显然,如果出现问题,我必须回滚才能让另一个任务再次尝试写入文件。

我使用Java 1.8(Spring Boot Framework)和SQLServer 2008 R2与Microsoft JDBC Driver 4.1。

在我的解决办法每个任务打开一个交易并锁定它要通过执行更新与ROWLOCK

DefaultTransactionDefinition dtd = new DefaultTransactionDefinition(); 
dtd.setIsolationLevel(DefaultTransactionDefinition.ISOLATION_READ_COMMITTED); 
dtd.setName(taskName); 
TransactionStatus ts =transactionManager.getTransaction(dtd); 

List<Long> result = jdbc.query("select top 3 * from D_TEST where STATUS = 0 order by 1",new LongExtractor()); 

for(Long l:result){ 
     jdbc.update("update D_TEST with (ROWLOCK) set STATUS = 1 where ID_ROW = "+l.toString()); 
} 

工作。然后它使用的ID列表来执行其他任务,如果一切正常,接近纪录该交易否则会回滚。

我希望如果另一个任务在第一个任务启动时仍然运行,当它需要一组IDS时它将不会收到锁定的任务。

问题il查询锁定整个表不仅仅是行。 我的错误在哪里?我怎样才能锁定一些行?

有人建议(SQL Server - Row Lock with JDBC)将隔离级别更改为ISOLATION_READ_UNCOMMITTED,但在这种情况下,我还读取了第一个任务正在更新的记录。 此外,在这个隔离级别下,第二个任务仍然停止等待它结束的第一个事务。

+0

即使你要求排名前3的记录,我敢打赌顺序是造成表锁,有什么索引排序? – SqlACID

回答

0

据我所知,已经做之前,你必须禁用这两个锁升级和指标页锁的SqlServer中强制行锁。

但是,这样做有后果。

以下是link供您参考。 希望这有助于。