gpt4 book ai didi

java - SQL Server 在没有表锁的情况下使用多个连接更新表

转载 作者:行者123 更新时间:2023-12-01 16:51:32 25 4
gpt4 key购买 nike

我在使用 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 上做的一样。

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

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

非常感谢您的帮助。

最佳答案

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

关于java - SQL Server 在没有表锁的情况下使用多个连接更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61676534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com