|
|
|
Транзакция, Default, триггер
|
|||
|---|---|---|---|
|
#18+
Добрый день всем. Открываю транзакцию в функции которая вызывается из Default поля, а закрываю в Insert trigger (собственный). Получаю ошибку "Rule and trigger code must balance transaction usage." С чем это связано? Почему так нельзя? Ведь транзакция закрывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2005, 11:22:52 |
|
||
|
Транзакция, Default, триггер
|
|||
|---|---|---|---|
|
#18+
В описании к ошибке 1598 сказано, что ты получил "пересекающиеся" транзакции. Что-то вроде: Код: plaintext 1. 2. 3. 4. Т.е. завершает транзакцию не тот процесс, который ее начал или вообще не удалось завершить тразакцию первого процесса. Видимо триггер на вставку не может начать работу, пока не сформировано значение полей (DEFAULT), а формирование значения полей не может завершиться из-за открытой транзакции. Впрочем, это надо бы проверить. А зачем такие сложности? Не проще начать транзакцию вручную во вне базы данных? Там, где ты даешь команду INSERT-SQL или APPEND ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2005, 11:55:50 |
|
||
|
Транзакция, Default, триггер
|
|||
|---|---|---|---|
|
#18+
ВладимирМА зачем такие сложности? Не проще начать транзакцию вручную во вне базы данных? Там, где ты даешь команду INSERT-SQL или APPEND Дело в том, что пишу на VFP6 и в Defaulte у меня считается уникальный ID с использованием таблицы ID, на форуме об этом много говорилось. Хотелось бы получать откат транзакции в триггере, если добавление записи по какой-то причине не произошло, т. е. возврашение старого ID, причем что бы это работало не зависимо от приложения. Я понимаю, что пропуск в нумерции ID не страшен. Меня заинтересовало почему ошибка. Ведь все вроде бы логично: - срабатывает Default -- открывается транзакция - срабатывает триггер -- закрывается транзакция Обе функции находятся в ХП. Может я что не так делаю? Я пробовал открывать транзакцию в Default первого поля, а закрывать в Default второго поле -- ошибка не возникает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2005, 12:55:47 |
|
||
|
Транзакция, Default, триггер
|
|||
|---|---|---|---|
|
#18+
Функция генерации нового ID может вызываться и сама по себе. Без связи с Default-поля. Иногда это бывает удобно, когда стоит задача определения нового ID без непосредственной записи в саму таблицу. А у тебя здесь "подвешенная" транзакция... Во-вторых, генерация Default-значения и процесс сохранения данных (триггер Insert) могут быть разнесены во времени. Что более неприятно, в этот момент пользователь может уйти попить чайку. А у тебя "подвешенная" транзакция. Другие пользователи от души матерят того программиста. Дело в том, что Default сработает и при добавлении новой записи в буферизированную таблицу, а триггер только и исключительно в момент сброса этого буфера в исходную таблицу. Т.е. твоя логика некорректна уже по самой постановке. Кстати, а ты уверен, что триггер Insert вообще начал работу? Таблица не буферезирована? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2005, 14:19:24 |
|
||
|
Транзакция, Default, триггер
|
|||
|---|---|---|---|
|
#18+
ВладимирМКстати, а ты уверен, что триггер Insert вообще начал работу? Таблица не буферезирована? Триггер Insert начал работу и отрабатвает до конца, ошибка появляется после. Я создал тестовую базу и в Browse добавляю новую запись. ВладимирМВо-вторых, генерация Default-значения и процесс сохранения данных (триггер Insert) могут быть разнесены во времени. Что более неприятно, в этот момент пользователь может уйти попить чайку. А у тебя "подвешенная" транзакция. А вот об этом я и не подумал. ВладимирМДело в том, что Default сработает и при добавлении новой записи в буферизированную таблицу, а триггер только и исключительно в момент сброса этого буфера в исходную таблицу. А этого я, честно говоря, не знал. Благодарю за разъяснения. ВладимирМТ.е. твоя логика некорректна уже по самой постановке.Да, действительно идея была глупой. Ну что взять с новичка? Еще раз спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2005, 15:00:55 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=310&tid=1593789]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 384ms |

| 0 / 0 |
