У меня возникла небольшая проблема с Microsoft SQL Server 12.0
. Моя цель - обновить несколько записей одновременно без противодействия блокировке таблицы (или любой другой блокировке). И все это просто с помощью драйвера JDB C с функциями 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 это можно сделать путем фильтрации по идентификатору строки
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 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
)
Заранее большое спасибо за помощь.