powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Microsoft SQL Server [закрыт для гостей] / Транзакции в MS SQL Server, Поиск: Искать сообщения, созданные автором: s62  
14 сообщений из 14, страница 1 из 1
Microsoft SQL Server / Транзакции в MS SQL Server
    #362109
s62
Скрыть профиль Поместить в игнор-лист
Участник
Привет,
раньше имел дело с Firebird, где транзакции прописывают (по крайне мере я прописывал :) ) явно. И с MySQL на сайте, где вообще без транзакций было.
Сейчас имею дело с программами, которые работают с MS SQL Server. Насколько я смутно припоминаю, в нем есть что-то насчет неявных транзакций, которые имплицитно (сами, ты этого не делаешь явно) стартуются и заканчиваются. Короче я в коде не вижу ничего про транзакции. И сам что-то делал, менял, как-то ничего про них не делал тоже. Да, программа на Delphi, компоненты для доступа - dbGo (обертка вокруг ADO).
Сейчас мне надо сделать несколько последовательных действий, которые хотелось бы выполнить в одной транзакции, чтобы или выполнить всё или откатить всё. Я вижу у компонента TAdoConnection методы BeginTrans, CommitTrans, RollbackTrans. В принципе понятно, что писать. Но вот такой вопрос, а как это будет взаимодействовать с другими процедурами, которые с неявными (или неявной) транзакциями?
Будет ли всё остальное, то, что работало до этого, работать нормально, если я напишу что-то типа
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Adoconnection.BeginTrans
try
  ...
  ...
  AdoConnection.CommitTrans;
except
  ...
  AdoConnection.RollbackTrans;
  ...
end;
После того, как это выполнится, последующие запросы и вызовы ХП будут ли работать норм?

Понятно, что можно поэкспериментировать, но так, теоретически, кто-нибудь может сказать что-то про это?
...
Изменено: 18.04.2023, 17:33 - s62
Рейтинг: 0 / 0
Microsoft SQL Server / Транзакции в MS SQL Server
    #362125
s62
Скрыть профиль Поместить в игнор-лист
Участник
s62 [игнорируется] 

почитал вот это https://learn.microsoft.com/ru-ru/sql/t-sql/language-elements/transactions-transact-sql?view=sql-server-ver16
похоже, что должно работать, что следующий запрос автоматически стартует новую транзакцию.
...
Рейтинг: 2 / 0
Нравится: PaNik, Гарыныч
Microsoft SQL Server / Транзакции в MS SQL Server
    #362767
s62
Скрыть профиль Поместить в игнор-лист
Участник
Sparrow  19.04.2023, 09:05
[игнорируется]
Главное понимать , что нет вложенных транзакций. При таком подходе.

В стэке xp не надо использовать
Begin transaction
Commit transaction
Rollbac transaction
Не совсем понял, что такое стэк хр. Это, если в теле одной хп вызывается другая хп? Да, примерно понятно, что если что-то будет откатываться так, то может наверное поломаться логика транзакций.
Кстати в субд Firebird в PSQL вообще нельзя использовать управление транзакциями, в смысле start, commit, rollback transaction. Предполагается, что хп выполняется в контексте транзакции, которая стартуется и коммитится или откатывается извне процедуры.

Спасибо за подсказку. Ну, я такое вроде и не собирался делать, теперь тем более буду знать. ) У меня по плану (надо вот сегодня дописать и потестировать), там один запрос и одна ХП выполняются. Ну вот перед этим соответстенно вручную собираюсь стартовать транзакцию, а в конце завершать или откатывать.
...
Рейтинг: 0 / 0
Microsoft SQL Server / Транзакции в MS SQL Server
    #362968
s62
Скрыть профиль Поместить в игнор-лист
Участник
Работает нормально, после выполнения этого другие процедуры тоже нормально пишут данные в БД.
Единственное, не помню точно, сталкивался с этим раньше или нет, думал, что в самой Delphi это не нужно: имена параметров хп начинаются с @. Сначала попробовал без @ вот так (изменил в примере название хп и параметра, типа соглашение о нераспространении :) ):
Код: Delphi
1.
    adoStoredProcBumBumBum.Parameters.ParamByName('Param1').Value := aParam1;
Пишет, не нашел такой параметр. А вот так заработало:
Код: Delphi
1.
    adoStoredProcBumBumBum.Parameters.ParamByName('@Param1').Value := aParam1;
...
Изменено: 19.04.2023, 15:33 - s62
Рейтинг: 0 / 0
Microsoft SQL Server / Транзакции в MS SQL Server
    #363008
s62
Скрыть профиль Поместить в игнор-лист
Участник
Sparrow  19.04.2023, 16:16
[игнорируется]
...

На стороне сервера там может быть много вложенных процедур.
И их разработчиков. Вот им надо запретить. Делать транзакции.
Ага, примерно понятно, чтобы был какой-то единый порядок, когда начали транзакцию, когда закончили.
...
Рейтинг: 0 / 0
Microsoft SQL Server / Транзакции в MS SQL Server
    #363019
s62
Скрыть профиль Поместить в игнор-лист
Участник
PaNik  19.04.2023, 16:14
[игнорируется]
Sparrow  19.04.2023, 16:12
[игнорируется]
s62  19.04.2023, 11:35
[игнорируется]
Sparrow  19.04.2023, 09:05
[игнорируется]
Главное понимать , что нет вложенных транзакций. При таком подходе.

В стэке xp не надо использовать
Begin transaction
Commit transaction
Rollbac transaction
Не совсем понял, что такое стэк хр. Это, если в теле одной хп вызывается другая хп? Да, примерно понятно, что если что-то будет откатываться так, то может наверное поломаться логика транзакций.
Кстати в субд Firebird в PSQL вообще нельзя использовать управление транзакциями, в смысле start, commit, rollback transaction. Предполагается, что хп выполняется в контексте транзакции, которая стартуется и коммитится или откатывается извне процедуры.

Спасибо за подсказку. Ну, я такое вроде и не собирался делать, теперь тем более буду знать. ) У меня по плану (надо вот сегодня дописать и потестировать), там один запрос и одна ХП выполняются. Ну вот перед этим соответстенно вручную собираюсь стартовать транзакцию, а в конце завершать или откатывать.
После создания транзакции, надо там же её завершить или откатить.
https://minyurov.files.wordpress.com/2014/10/microsoft-sql-server-2012-t-sql.pdf
Блин, а я как раз вот это начал изучать, да потом забросил. Это вот в августе того года раздел изучал.
MSSQL_learn1.jpg
MSSQL_learn2.jpg
...
Рейтинг: 0 / 0
Microsoft SQL Server / Транзакции в MS SQL Server
    #363031
s62
Скрыть профиль Поместить в игнор-лист
Участник
PaNik  19.04.2023, 16:26
[игнорируется]
прочитай книжку (можно выборочно) по моей ссылке - хоть и по древней версии - понимание работы сервака организует
Посмотрю. Ну я думаю, что в общем серверы БД в каких-то общих принципах схоже устроены. Но понятно, что у каждого есть свои особенности, в том числе у MS SQL server. Вот может про них в частности посмотрю. У меня по нынешней работе это такое, немного сбоку, в принципе другой человек вносил в основном изменения в БД, но приходилось и запросы писать и в БД изменения вносить.
...
Рейтинг: 0 / 0
Microsoft SQL Server / Транзакции в MS SQL Server
    #363179
s62
Скрыть профиль Поместить в игнор-лист
Участник
Ифрит  19.04.2023, 18:21
[игнорируется]
s62  19.04.2023, 11:35
[игнорируется]
субд Firebird в PSQL вообще нельзя использовать управление транзакциями, в смысле start, commit, rollback transaction. Предполагается, что хп выполняется в контексте транзакции, которая стартуется и коммитится или откатывается извне процедуры
как-то воопще не понятно.. имея этот кошерный подход в опыте, зачем искать извратов.. ?
Да я не совсем про это спрашивал. В Firebird все транзакции явные (или я так ошибочно думал до сих пор, но всегда в IBX их стартовал и т.д.) А в MS SQL Server есть 3 типа, явные, неявные и т.д. И мне было непонятно (или не совсем понятно) сначала, как они сочетаются, ну в моих сообщениях это есть. А старт, коммит и откат транзакции я и поставил снаружи, в клиентском коде.
...
Изменено: 19.04.2023, 18:29 - s62
Рейтинг: 0 / 0
Microsoft SQL Server / Транзакции в MS SQL Server
    #363180
s62
Скрыть профиль Поместить в игнор-лист
Участник
Парни, всем спасибо, и Панику, и Воробью - за ответы, и Гарынычу за поддержку разговора. Не ругайтесь в этой теме, плз.
...
Изменено: 19.04.2023, 18:29 - s62
Рейтинг: 1 / 0
Нравится: Гарыныч
Microsoft SQL Server / Транзакции в MS SQL Server
    #363746
s62
Скрыть профиль Поместить в игнор-лист
Участник
Горбатый ёж  20.04.2023, 08:56
[игнорируется]
s62  19.04.2023, 18:27
[игнорируется]
В Firebird все транзакции явные (или я так ошибочно думал до сих пор, но всегда в IBX их стартовал и т.д.)
Это ты ошибочно думал.
То что ты их стартовал явно, не говорит о том, что там только явные транзакции.
В документации MS SQL server написано про автоматические и неявные транзакции. Я приводил тут ссылку: https://learn.microsoft.com/ru-ru/sql/t-sql/language-elements/transactions-transact-sql?view=sql-server-ver16
В документации Firebird ничего такого нет. Транзакция настраивается и запускается командой set transaction https://www.firebirdsql.org/file/documentation/chunk/en/refdocs/fblangref40/fblangref40-transacs.html

Другое дело, что из клиентского приложения мы с БД можем работать через те или иные компоненты доступа к БД. И в этих компонентах тразнакции могут стартоваться автоматически. Но это не особенность Firebird, а особенность компонентов доступа.
Ты это имел в виду или что-то другое?
Можно наверное отделить в раздел FB.
...
Рейтинг: 0 / 0
Microsoft SQL Server / Транзакции в MS SQL Server
    #363975
s62
Скрыть профиль Поместить в игнор-лист
Участник
Горбатый ёж [игнорируется] 
Не собираюсь сейчас экспериментировать с консолью и тебе что-то рассказывать. У меня есть свой опыт работы с Firebird из приложений, есть документация.
...
Изменено: 20.04.2023, 13:08 - s62
Рейтинг: 0 / 0
Microsoft SQL Server / Транзакции в MS SQL Server
    #363989
s62
Скрыть профиль Поместить в игнор-лист
Участник
Горбатый ёж [игнорируется] 

В консоли транзакция стартует автоматически, но это делает сама консоль, сама утилита.
Цитата 
[игнорируется]
In isql, a transaction is begun as soon as the utility is started. The transaction is begun in SNAPSHOT isolation, with a lock resolution set to WAIT.
...
Рейтинг: 0 / 0
Microsoft SQL Server / Транзакции в MS SQL Server
    #365681
s62
Скрыть профиль Поместить в игнор-лист
Участник
cat2  21.04.2023, 19:06
[игнорируется]
cat2  21.04.2023, 19:03
[игнорируется]
Ссылочку дай, где это написано.
Не надо, понял. Это про то, если установлен экзотический режим - SET IMPLICIT_TRANSACTIONS ON.
По умолчание он выключен
Ну вот тут же написано, что если выключен, то
Цитата 
[игнорируется]
Если задано значение OFF, каждая из предыдущих инструкций T-SQL ограничена невидимыми инструкциями BEGIN TRANSACTION и COMMIT TRANSACTION. При значении OFF транзакция выполняется в режиме автофиксации.
"Автофиксация", посмотрел английскую верию страницу, это они так перевели autocommit.

https://learn.microsoft.com/ru-ru/sql/t-sql/statements/set-implicit-transactions-transact-sql?view=sql-server-ver16
То есть select (как и другие инструкции из списка) выполняется в отдельной транзакции. Перед ним невидимый BEGIN TRANSACTION, после него - невидимый COMMIT TRANSACTION.
...
Изменено: 21.04.2023, 19:15 - s62
Рейтинг: 1 / 0
Нравится: Гарыныч
Microsoft SQL Server / Транзакции в MS SQL Server
    #365722
s62
Скрыть профиль Поместить в игнор-лист
Участник
Неуловимый Джо  21.04.2023, 19:27
[игнорируется]
s62 [игнорируется] 

Спорить с котом о том что 2 * 2 = 4 надоело )
Просто учитывай в работе, что если тебе надо транзакцию в процедуре, то придется делать begin tran ... commit.
Операторы в процедуре НЕ выполняются в одной транзакции, проверяется элементарным экспериментом.

Ну и стандартные советы, постарайся делать транзакции короткими, не надо всю процедуру оборачивать.
Спасибо за подсказки и советы. У нас там есть организационные моменты - кто пишет БД, кто программу, второе, что на предприятиях, где работает оборудование, не одна БД и много программ, а обычно одна БД и один экземпляр программы работает. Поэтому я написал прямо в программе вот так.
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TDataModule1.UpdateAnalyzerSources(aAnalyzerId: integer; aSources: TSources);
begin
  AdoConnection1.BeginTrans;
  try
    RemoveAnalyzerSources(aAnalyzerId); //вот тут вообще просто выполняется запрос, по некоторым причинам
    AddAnalyzerSources(aAnalyzerId, aSources); //вот тут вызывается ХП, несколько раз в цикле
    AdoConnection1.CommitTrans;
  except
    on E: Exception do
    begin
      AdoConnection1.RollbackTrans;
      Application.MessageBox(PChar(rsUpdateSourcesFail + E.Message), PChar(Application.Title), MB_OK);
    end;
  end;
end;
Это после того, как в диалоговом окне редактируются Sources заданного Analyzer и пользователь нажал ОК. Тут транзакция, как про это писал и Горбатый Ёж, должна обеспечить логическую целостность: или мы удаляем старые и добавляем новые, или если что-то пошло не так, то возвращаем, как было.
...
Изменено: 21.04.2023, 19:58 - s62
Рейтинг: 1 / 0
Нравится: Ифрит
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [закрыт для гостей] / Транзакции в MS SQL Server, Поиск: Искать сообщения, созданные автором: s62  
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (17): Анонимы (13), Yandex Bot, Bing Bot 1 мин., Брюквенные годы 1 мин., CCBot 2 мин.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
x
x
Закрыть


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