繁体   English   中英

SQL 服务器更新表多连接无表锁

[英]SQL Server update table with multiple connections without tablelock

我在 Microsoft SQL Server 12.0遇到了一些问题。 我的目标是同时更新多条记录,而不用对抗 tablelock(或任何其他锁)。
这一切只需在多线程情况下使用 JDBC 驱动程序和 function 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 服务器上获得这个的方法我发现使用 SQL 服务器的分页会创建一个表锁,就像这个查询一样。

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

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

任何人都可以提示我缺少的部分会禁用桌锁吗? 因为每个线程都不会与其他 session 发生冲突?

(使用单线程更新有效,只是这可能需要很长时间,这就是为什么我想将表拆分为单独的工作人员。( totaltime_on_singlethread / amount_threads = total_execution_time

非常感谢您的帮助。

我猜你在这张桌子上遇到了死锁。 T-sql提供了这样的解决方案: SET TRANSACTION ISOLATION LEVEL READ COMMITTED; . 运行时,每个连接仅处理未更改的已提交行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM