Транзакции

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

Hryv

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

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

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

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

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

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

Дайнеко

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

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

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

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

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

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

Darlock

Well-known member
04.01.2008
560
1
#3
Вчерашняя тема пропала, а проблема у меня осталась

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

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

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

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

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

Hryv

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

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

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

Дайнеко

Well-known member
19.11.2009
951
0
#5
Вижу, что идея маниакально овладела Вашим сознанием. А смысл не понятен...