|
Посылка пакетами инструкции TSQL
|
|||
---|---|---|---|
#18+
Из приложения посылаю запросы в MS SQL Server. Посылаю пакетами. 1й пакет: удаление таблицы, создание таблицы, очистка таблицы. 2й пакет: копирование данных из одной таблицы в другую, update, удаление таблицы. Пакеты работают по-разному, не пойму, почему. 1й пакет: Код: java 1. 2. 3. 4. 5. 6. 7. 8.
2й пакет, следует за первым после BULK INSERT Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
если 2й пакет переписать, как первый, то есть добавить BEGIN TRAN -- COMMIT TRAN и убрать connectionSQL.commit() , то результат работы 2го пакета не сохраняется в БД. ПОЧЕМУ?? Итого 2 вопроса: почему для первого пакета надо ставить BEGIN TRAN -- COMMIT TRAN, а для второго пакета COMMIT не происходит, если добавить инструкции BEGIN TRAN -- COMMIT TRAN? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 11:25 |
|
Посылка пакетами инструкции TSQL
|
|||
---|---|---|---|
#18+
Диана Орел, Внимательно смотрите, что Вы выполняете. 1. Отключаете автоматическую фиксация транзакций, лишнее при Вашей желаемой логике. 2. Начинаете явно транзакицию. 3. Выполняете пакет 1. 4. Фиксируете транзакцию 5. Начинаете выполнение пакета два. При выполнении insert into автоматически создается транзакция, и остается открытой до выполнения connectionSQL.commit(). Читайте справку, как работают транзакции, там поймёте. В MS SQL все команды выполняются в транзакциях, явных или неявных, с автоматической фиксацией или явно указанной. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 11:35 |
|
Посылка пакетами инструкции TSQL
|
|||
---|---|---|---|
#18+
Владислав Колосов 1. Отключаете автоматическую фиксация транзакций, лишнее при Вашей желаемой логике. Разве это не убыстряет работу всего пакета? по аналогии с лифтом: доехать до 5 этажа без остановки или останавливаться на каждом этаже? Владислав Колосов 2. Начинаете явно транзакцию. 3. Выполняете пакет 1. 4. Фиксируете транзакцию по другому этот пакет не получается выполнить. В документации написано: Неявные транзакции Новая транзакция неявно начинается, когда предыдущая транзакция завершена, но каждая транзакция явно завершается инструкцией COMMIT или ROLLBACK. , если убрать BEGIN TRAN, то все равно транзакция начинается неявно. И надо ее явно фиксировать. так вот, как фиксировать явно?: если через connectionSQL.commit(), то возникает ошибка New request is not allowed to start because it should come with valid transaction descriptor SQL_ServerThis error occurs when you execute a distributed query that joins multiple tables hosted by remote instances of SQL Server while the XACT_ABORT session setting is ON. An error message similar to the following is reported to the user: хотя у меня один сервер. Мне не понятно, почему инструкции в 1м пакете надо выполнять в режиме явного указания транзакции? В SSMS выполняется Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
вывод: 0 1 0 Владислав Колосов 5. Начинаете выполнение пакета два. При выполнении insert into автоматически создается транзакция, и остается открытой до выполнения connectionSQL.commit(). По второму пакету работа понятна: создается неявная транзакция, я ее явно фиксирую. Наверное, эти нюансы работы из-за реализации библиотеки jdbc, я так думаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 15:18 |
|
Посылка пакетами инструкции TSQL
|
|||
---|---|---|---|
#18+
Диана Орел, Разве это не убыстряет работу всего пакета? Нет, эта настройка запрещает закрывать транзакцию автоматически. Просто уберите setAutoCommit(false) и connectionSQL.commit(); и выполняйте begin tran ... commit в каждом пакете. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2022, 15:26 |
|
|
start [/forum/topic.php?fid=46&msg=40136360&tid=1683800]: |
0ms |
get settings: |
4ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
47ms |
get topic data: |
4ms |
get forum data: |
1ms |
get page messages: |
105ms |
get tp. blocked users: |
1ms |
others: | 7ms |
total: | 176ms |
0 / 0 |