具有多个连接且没有表锁的SQL Server更新表

问题描述 投票:0回答:1

我在Microsoft SQL Server 12.0中遇到了一些问题。我的目标是同时更新多个记录,而不会产生表锁(或任何其他锁)。而且,所有这些都只需要使用JDBC驱动程序,在多线程情况下,函数resultSet.updateObject(<column>,<newValue>)resultSet.updateRow()都将与每个线程建立到数据库的连接。

我试图实现的情况是这样的:

Table 'a' with 100.000 record
split into 5 connections who is dealing each 20.000 records
Each thread get its own connection with its own select query to update.(no records overlapping) 
Each thread is handling its own updates. Generating unique values depending op de application.
After the thread is completed it commits and closed the connection on that thread.

我知道使用MySQL进行分页查询而没有任何锁定问题是可能的:

select id, column_a, column_b from table a limit 0,20000
select id, column_a, column_b from table a limit 20000,20000
etc..

并且对于Oracle DB,可以通过对rowid进行过滤来完成

select id, column_a, column_b from table a where rowid like '%1'
select id, column_a, column_b from table a where rowid like '%2'

现在,我需要找到在SQL Server上获得此权限的方法我发现使用SQL Server分页会创建一个表锁,例如此查询。

select id, column_a, column_b from a order by id offset 0 rows fetch first 20000 rows only

即使我在查询中使用with(nolock)参数。我还尝试将表的锁定级别更改为禁用。并且还尝试对%%physloc%%进行过滤,就像在oracle上进行过滤一样。

有人能提示我我缺少的那部分将禁用表锁吗?因为每个线程都不会与另一个会话发生冲突?

(使用单个线程进行更新是可行的,只有这可能需要一些时间,这就是为什么我想将表拆分为单独的工作程序。([totaltime_on_singlethread / amount_threads = total_execution_time

非常感谢您的帮助。

java sql sql-server database jdbc
1个回答
0
投票

我想你在这张桌子上陷入僵局。 T-sql提供了以下解决方案:SET TRANSACTION ISOLATION LEVEL READ COMMITTED;。运行时,每个连接仅处理未更改的已提交行

© www.soinside.com 2019 - 2024. All rights reserved.