powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Посылка пакетами инструкции TSQL
5 сообщений из 5, страница 1 из 1
Посылка пакетами инструкции TSQL
    #40136360
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из приложения посылаю запросы в MS SQL Server. Посылаю пакетами.
1й пакет: удаление таблицы, создание таблицы, очистка таблицы.
2й пакет: копирование данных из одной таблицы в другую, update, удаление таблицы.
Пакеты работают по-разному, не пойму, почему.
1й пакет:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
connectionSQL.setAutoCommit(false);
String sqlTxt = String.format("BEGIN  TRAN " //добавила, потому что  connectionSQL.commit() выдает ошибку
                                + "if object_id('%s') is not null drop table %s; "
				+ "select top 1 * into %s from %s; "
				+ "truncate table %s; COMMIT TRAN", workTable, workTable, workTable, targetTable, workTable);
stmt.addBatch(sqlTxt);
int[] res = stmt.executeBatch();
/*connectionSQL.commit();  если не убрать, то будет ошибка com.microsoft.sqlserver.jdbc.SQLServerException: New request is not allowed to start because it should come with valid transaction descriptor. */


2й пакет, следует за первым после BULK INSERT
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
stmt.clearBatch();
sqlTxt= String.format("TRUNCATE TABLE %s; "
				+ "insert into %s from %s; "
				+ "update %s set LOAD_DTM = GETDATE(), SESSION_ID = %d;"
				+ "drop table %s;", targetTable, targetTable, workTable, targetTable, SESS_NO, workTable);

stmt.addBatch(sqlTxt);
res = stmt.executeBatch();
connectionSQL.commit();


если 2й пакет переписать, как первый, то есть добавить BEGIN TRAN -- COMMIT TRAN и убрать connectionSQL.commit() , то результат работы 2го пакета не сохраняется в БД. ПОЧЕМУ??
Итого 2 вопроса: почему для первого пакета надо ставить BEGIN TRAN -- COMMIT TRAN, а для второго пакета COMMIT не происходит, если добавить инструкции BEGIN TRAN -- COMMIT TRAN?
...
Рейтинг: 0 / 0
Посылка пакетами инструкции TSQL
    #40136368
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел,

Внимательно смотрите, что Вы выполняете.

1. Отключаете автоматическую фиксация транзакций, лишнее при Вашей желаемой логике.
2. Начинаете явно транзакицию.
3. Выполняете пакет 1.
4. Фиксируете транзакцию
5. Начинаете выполнение пакета два. При выполнении insert into автоматически создается транзакция, и остается открытой до выполнения connectionSQL.commit().

Читайте справку, как работают транзакции, там поймёте. В MS SQL все команды выполняются в транзакциях, явных или неявных, с автоматической фиксацией или явно указанной.
...
Рейтинг: 0 / 0
Посылка пакетами инструкции TSQL
    #40136434
Диана Орел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов

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.
SET IMPLICIT_TRANSACTIONS  ON ;

print @@TRANCOUNT
if object_id('db1.dbo.T_MVZ_$T') is not null drop table db1.dbo.T_MVZ_$T;
select top 1 * into db1.dbo.T_MVZ_$T from db1.dbo.T_MVZ;
truncate table db1.dbo.T_MVZ_$T;
print @@TRANCOUNT
commit;
print @@TRANCOUNT


вывод:
0
1
0
Владислав Колосов

5. Начинаете выполнение пакета два. При выполнении insert into автоматически создается транзакция, и остается открытой до выполнения connectionSQL.commit().

По второму пакету работа понятна: создается неявная транзакция, я ее явно фиксирую.
Наверное, эти нюансы работы из-за реализации библиотеки jdbc, я так думаю.
...
Рейтинг: 0 / 0
Посылка пакетами инструкции TSQL
    #40136440
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел,

Разве это не убыстряет работу всего пакета?
Нет, эта настройка запрещает закрывать транзакцию автоматически.

Просто уберите setAutoCommit(false) и connectionSQL.commit();
и выполняйте begin tran ... commit в каждом пакете.
...
Рейтинг: 0 / 0
Посылка пакетами инструкции TSQL
    #40136441
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диана Орел,

авторNew request is not allowed to start because it should come with valid transaction descriptor

Какие-то особенности драйвера.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Посылка пакетами инструкции TSQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]