• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Транзакции

  • Автор темы Автор темы Hryv
  • Дата начала Дата начала
H

Hryv

Вчерашняя тема пропала, а проблема у меня осталась

В процедуре, которая вызывается по кнопке, делаю НачатьТранзакцию()
Если ЗафиксироватьТранзакцию() (или ОтменитьТранзакцию()) выполнить до завершения этой процедуры, то все работает нормально

А если процедура завершается без закрытия транзакции, то при попытке выполнить ЗафиксироватьТранзакцию() (или ОтменитьТранзакцию()) выдается ошибка типа "нет транзакции"

Получается, что при завершении процедуры транзакция фиксируется неявно?

Можно ли как-то это обойти?

Мне хотелось бы начать транзакцию, дать поработать юзеру, а затем завершить транзакцию
 
Мне хотелось бы начать транзакцию, дать поработать юзеру, а затем завершить транзакцию
Я правильно понял: зашел в процедуру, начал транзакцию (Трз), вышел из процедуры. Потом покурил минут 10, в смысле постучал по клавишам. Зашел в другую процедуру (другую кнопку нажал) - в ней закрыл Трз.

Код:
Проц НажалКнопкуА()
НачатьТранзакцию() 
Конец

Проц НажалКнопкуБ()
ЗафиксироватьТранзакцию()
Конец
Вычурно это, брат. Получается, хочешь открыть Трз на длительное время. И на все это время БД ей заблокирована, включая то, что "работающий" юзер не может записать и провести документ. Ведь проведение - это неявный вызов Трз. Произойдет двойное вложение.
Что касается
Получается, что при завершении процедуры транзакция фиксируется неявно
, то я полагаю, что Да - фиксируется, только не рамками процедуры, а передачей управления пользователю. Если не лень, проверь экспериментом:

Код:
Проц А()
НачатьТранзакцию() 
Конец

Проц Б()
ЗафиксироватьТранзакцию()
Конец

Проц НажалКнопку()
А();
Б();
Конец
Так должно работать. Т.к. код выполняется как цельная реакция одного клика.
P.S. Да простят меня за неверные предположения, ибо глаголю руководствуясь не опытом, а токмо силой разума и знания жития.
 
Вчерашняя тема пропала, а проблема у меня осталась

В процедуре, которая вызывается по кнопке, делаю НачатьТранзакцию()
Если ЗафиксироватьТранзакцию() (или ОтменитьТранзакцию()) выполнить до завершения этой процедуры, то все работает нормально

А если процедура завершается без закрытия транзакции, то при попытке выполнить ЗафиксироватьТранзакцию() (или ОтменитьТранзакцию()) выдается ошибка типа "нет транзакции"

Получается, что при завершении процедуры транзакция фиксируется неявно?

Можно ли как-то это обойти?

Мне хотелось бы начать транзакцию, дать поработать юзеру, а затем завершить транзакцию

Нет. Транзакция не завершается, а прерывается. И поэтому нельзя начать транзакцию в одной процедуре, а зафиксировать/отменить в другой. Попробуйте открыть цикл в одной процедуре, а завершить его в другой, какой будет результат?
 
Дайнеко, именно так все и происходит, я это выяснил еще раньше
Но думал, что может что-то я упустил

Жаль, что нет возможности сделать как я хочу
Понятно, что с такой возможностью надо аккуратно обращаться
Можно было, например, сделать ограничение на такое использование транзакций - работает только в монопольном режиме
Придется обходить проблему иначе

Нет. Транзакция не завершается, а прерывается.
Я все же сказал бы что завершается, так как все изменения внутри транзакции сохраняются
А пример с циклом считаю совершенно некорректным сравнением
 
Вижу, что идея маниакально овладела Вашим сознанием. А смысл не понятен...
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab