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

标签 java sql sql-server database jdbc

我在使用 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/

相关文章:

java.lang.IllegalStateException : Unable to retrieve EntityManagerFactory for unitName CrudPU 错误

java - 部署期间出现 ClassNotFound 异常

sql - 创建规则来限制sql server表中的特殊字符

sql - SQL 能够返回嵌套数据吗?如果没有,是否有最佳实践?

sql-server - 将字符串转换为 Datetime2

java - 使用 WSDL 和 codehaus jaxb2 的 Spring Soap Web 服务客户端;需要 XmlRootElement 吗?

java - 在没有连接 Servlet 的情况下将 JSP 与 Tomcat 一起使用

sql - 查找出现次数

SQL:为一组列选择顶部记录

sql-server - SQL Server 能否在 SCO SantaCruz Operations SO (Linux) 上运行?