• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Транзакции

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

Hryv

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

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

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

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

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

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

Дайнеко

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

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

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

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

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

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

Darlock

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

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

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

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

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

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

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

Hryv

Дайнеко, именно так все и происходит, я это выяснил еще раньше
Но думал, что может что-то я упустил

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

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

Дайнеко

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!