这是我的问题: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
,但在这种情况下,我还读取了第一个任务正在更新的记录。 此外,在这个隔离级别下,第二个任务仍然停止等待它结束的第一个事务。
即使你要求排名前3的记录,我敢打赌顺序是造成表锁,有什么索引排序? – SqlACID