|
|
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Написал триггер для подсчета текущего остатка по счету, он не всегда срабатывает. Т.е. иногда появляется неверная сумма в поле acc.current_rest. Не могу понять что я сделал неверно. DDL (не абсолютно точный но в сути полностью повторяющий боевой код) под спойлером. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 08:15:44 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Shr, Так этож фича. :) Триггер не может правильно подсчитать сумму по определению. Заведи себе вьюшку, можно материализованную, и считай там правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 08:26:24 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев Так этож фича. :) Триггер не может правильно подсчитать сумму по определению. Заведи себе вьюшку, можно материализованную, и считай там правильно.Почему не может? При update acc происходит блокировка записи, и следующий (во второй сессии) update пройдет только после коммита первой сессии, т.е. в set current_rest=current_rest+delta будет прочитан current_rest уже измененный первой сессией. С мат. вью есть некоторые проблемы обратной совместимости - сессия сделавшая insert в acc_move не увидит правильного остатка вплоть до коммита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 08:36:24 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
ShrПочему не может? При update acc происходит блокировка записи, Из простого - и при insert тоже. Только вот вторая транзакция твоего insert не заметит. А commit сделает, например, после первой. Вот и будет у нее сумма не та. Короче сделай нормальную вьюху и не пытайся обмануть судьбу велосипедом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 08:47:53 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
ShrС мат. вью есть некоторые проблемы обратной совместимости - сессия сделавшая insert в acc_move не увидит правильного остатка вплоть до коммита. Так и делай подсчет суммы для транзакции отдельно по окончании первой операции. Но понимай, что он темпорален и в момент когда ты получил ответ, он уже может быть не верен. Ну или выстраивай транзакции в очередь блокировками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 08:52:14 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, не "не верен", а "не актуален" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 08:53:37 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевИз простого - и при insert тоже. Только вот вторая транзакция твоего insert не заметит.insert в какую таблицу? Если acc, то это будет новая запись остаток в которой будет подсчитываться с нуля и вторая транзакция вообще этот счет не знает, если в acc_move то триггер все равно делает update acc, который вешает блокировку о которой я и говорил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 08:58:37 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
2 Сергей Арсеньев > Так и делай подсчет суммы для транзакции отдельно по окончании первой операции. Если бы код писался с нуля - то и вопросов бы не было, но есть уже немало кода в разных клиентах который может быть написан не так, и его придется просматривать и возможно исправлять. > Ну или выстраивай транзакции в очередь блокировками. Триггер из первого поста именно это и должен делать, и я не понимаю почему не делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 09:03:26 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Shr, а у тебя merge над acc_move не бывает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 09:29:40 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
В all_source не нашел, но вообще не вижу причин его запрещать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 09:39:57 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Shr, Ну это просто вторая часть балета compound и merge ведут себя не совсем так, как по началу думаешь Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. результат Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 10:14:58 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Т.е. при merge before и after statement части триггера срабатывают по два раза. Для исправления достаточно, вроде бы, очистить коллекцию изменений после merge. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 10:29:36 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Зачем compound? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 10:53:02 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
-2-Зачем compound?Чтобы не создавать дополнительного пакета для хранения коллекции. В этом есть какие-то подводные камни? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 10:59:22 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
ShrТ.е. при merge before и after statement части триггера срабатывают по два раза. Для исправления достаточно, вроде бы, очистить коллекцию изменений после merge. Какую. Если ты заметишь, то для insert ее и так нет. :) Временная табличка не лучше ли будет? ее да очищать придется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 11:06:55 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Shr-2-Зачем compound?Чтобы не создавать дополнительного пакета для хранения коллекции. В этом есть какие-то подводные камни?Перефразирую. Зачем выносить апдейт из строчного триггера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 11:13:18 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевКакую. Если ты заметишь, то для insert ее и так нет. :)Упс, слона-то я и не заметил. Думал, глобальная переменная будет вести себя как в пакете - т.е. сохраняться в течение всей сессии (не считая сброса при перекомпиляции). -2-Зачем выносить апдейт из строчного триггера?Чтобы при массовом изменении acc_move и update acc тоже был массовым, а не построчным. Но вообще, если таких операций немного, то этим можно и пренебречь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 11:30:11 |
|
||
|
Подсчет текущего остатка триггером
|
|||
|---|---|---|---|
|
#18+
Проверил. Когда row level триггер во время merge натыкается на неинициализированную коллекцию то выдает ошибку при попытке её расширить. Т.е. неверных значений это породить не может. И значит ошибка где-то в другом месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2016, 13:36:48 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39276797&tid=1887852]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
135ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 391ms |

| 0 / 0 |
