|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
hi all Имеется след. схема: tmx - таблица заголовков "документов"; имеет поле OP, принимающее одно из двух значений: 1 или 2; tdx - подчиненная ей деталь, связана по FK с tmx *двумя* каскадами (см ниже); имеет такое же поле OP, как и tmx, а также int-поле QTY; tq1 и tq2 - две таблицы одинаковой структуры, в которых хранятся строки, логически подчинённые tdx, но НЕ связанные с этой таблицей FK. Когда в tdx добавляется строка с каким-то целочисленным QTY, то если new.op = 1, будет добавлено N записей в таблицу TQ1, а если new.op=2 - то N записей в таблицу TQ2. При этом N всегда = new.qty (напомню, QTY - целочисленное). Записи в таблице tmx могут, помимо добавления и удаления, также обновляться, но при этом меняется только содержимое поля OP: если оно = 1, то новое значение будет равно 2, и наоборот. Каскадный триггер на update приведёт к обновлению этого же поля (OP) в таблице tdx. На таблице tdx определен триггер before update or delete. Этот триггер: 1) при удалении - грохает все записи в TQ1 & TQ2, относящиеся к tdx.pid; 2) при обновлении (а это м.б. только поле OP) - выполняет перенос строк: 2.1) если new.op = 1, то из TQ2 в TQ1; 2.2) если new.op = 2, то из TQ1 в TQ2. Перенос строк TQ1<-->TQ2 делается БЕЗ "искажения" записей, т.е. с сохранением первичных ключей, которые были им присвоены при вставке (через gen_id). Выполняется этот перенос так (пример для SOURCE = TQ1, TARGET = TQ2): Код: sql 1. 2. 3. 4. 5.
Кроме того, есть еще таблица TLOG для логирования возникающих исключений в автономной транзакции. Эта схема, при работе транзакций с TIL = SNAPSHOT, будет допускать исключения вида lock_conflict, однако в ней не должны создаваться исключения вида PK/UK violation, либо FK violation. Потому что сначала лочатся родительские записи, и только потом начинается перенос строк TQ1<-->TQ2 (либо их удаление). Однако, при интенсивной борьбе 50 молотилок можно быстро получить по лбу исключением unique_key_violation (gds=335544665). Причину этого я понять не могу, поможыте разобраться, плз. Вот DDL : Код: plaintext 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. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249.
Вот запрос, который надо "размножить" 100500 млн раз, чтобы натравливание на него isql'ей не приводило к частым переконнектам: file = `tq_run.sql`; требуется размножить его текст многократно, чтобы получить большой скрипт Код: plaintext 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.
И вот батник: file = `tq_run.bat`, запускать с параметром, равным числу запускаемых окон-молотилок Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Батник надо подправить под свои переменные окружения. Если запустить этот батник вот так: tq_run.bat 50 - то будет открыто 50 isql'ей, которые начнут молотьбу. В аттаче - сжатый скрипт tq_run.sql, который есть результат 100500 размножений вышеприеденного .sql. Если в базе будет зарегистрировано одно из след. исключений: Код: plaintext 1. 2. 3. 4. 5.
В трейсе при этом будет: Код: plaintext 1. 2. 3. 4. 5.
Ну так вот. При запуске 50 окон достаточно быстро (через 5-10 минут) тест самоостановится и в таблице TLOG будет вот это: Код: sql 1.
SEL_IDUNITHANDLE_MODEFB_GDSCODETRN_IDDTS1165462tdx_budtry: ins tq2, del in tq1, id=11663973355446651842812.08.2014 00:06:06.8621165462p_tmx_hadle_docupd in tmx, id=11654623355446651843012.08.2014 00:06:06.8922476196tdx_budtry: ins tq1, del in tq2, id=25775263355446651867912.08.2014 00:07:06.4623147023tdx_budtry: ins tq2, del in tq1, id=31792543355446651868012.08.2014 00:07:06.5273147023p_tmx_hadle_docupd in tmx, id=31470233355446651868112.08.2014 00:07:06.5542476196p_tmx_hadle_docupd in tmx, id=24761963355446651868412.08.2014 00:07:06.6262534478tdx_budtry: ins tq1, del in tq2, id=25881503355446651868612.08.2014 00:07:07.5462534478p_tmx_hadle_docupd in tmx, id=25344783355446651868712.08.2014 00:07:07.5701831720tdx_budtry: ins tq1, del in tq2, id=19156083355446651869812.08.2014 00:07:13.6041831720p_tmx_hadle_docupd in tmx, id=18317203355446651869912.08.2014 00:07:13.642 Как такое может происходить ? PS. В ddl-коде, приведенном выше, на самом деле есть одна "ошибка проектирования": таблицы TQ1 & TQ2 должны ссылаться полем PID не на TDX. P ID, а на TDX. ID . Из-за этой ошибки получается, что при удалении уже первой из строки документа в TDX сразу грохаются (или же переносятся между TQ1 и TQ2) не только строки, относящиеся к "первой из деталей", но и строки ко всем остальным "деталям" данного документа. То есть, TQ1.PID & TQ2.PID ссылаются на самом деле не на строку-деталь, а на строку-заголовок документа. Однако, сиё не может (как мну кажется) влиять на появление PK/UK-violation'ов. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 00:36 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
ТаблоидPS. В ddl-коде, приведенном выше, на самом деле есть одна "ошибка проектирования": таблицы TQ1 & TQ2 должны ссылаться полем PID не на TDX. P ID, а на TDX. ID .Подправил код, теперь TQ1 & TQ2 ссылаются своим PID на отдельную строку: TDX.ID, а не на документ, как было ошибочно сделано ранее. Кроме того, добавил FK на каждую из этих таблиц, для верности (но без каскада). И всё равно при запуске 100 молотилок лезет та же грабля: через 5-7 минут какое-то из isql-окон получает PK-violation: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: sql 1. 2. 3. 4. 5. 6.
DDL : Код: plaintext 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. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 02:53 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
... и даже если добавить вот такой before-триггерок на master-таблицу, который будет явно лочить все подчинённые записи в tdx: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
- всё равно не помогает. Конструкция держится подольше, конечно. Но через час (при грузилове от 150 окон) всё равно разломается на том же месте - загадочном нарушении PK таблицы TQx: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
DDL : Код: plaintext 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. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 09:32 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
мнды... тут еще и FK можно получить, оказывается (правда, долго ждать пришлось: полтора часа молотьбы). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
И строка эта соотв-вует попытке удаления master-записи: Код: plaintext 1. 2.
Но срабатывание каскадного триггера (FK tdx->tmx, on delete cascade) должно вроде бы дёргать удаление всех подчинённых строк в tdx, а тамошний НЕ-каскадный триггер tdx_bud ( before delete or update) должен сначала грохать все подчинённые строки в TQ1 & TQ2: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
ЯНХНП! Как вообще такое может происходить, что "путается" порядок срабатывания триггеров ?! ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 13:38 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
ТаблоидКак вообще такое может происходить, что "путается" порядок срабатывания триггеров ?! Ты апдейтишь первичный и вторичный ключи в триггерах. Триггера работают в пределах транзакции, ключи - надтранзакционны. Результат в виде гонки потоков закономерен. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 13:51 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
ТаблоидЯНХНП!+100500 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 14:02 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovТы апдейтишь первичный и вторичный ключи в триггерах. Триггера работают в пределах транзакции, ключи - надтранзакционны. Результат в виде гонки потоков закономерен.Погодь! Триггера работают в строго определённом порядке. Если я делаю: delete from <master> where id = ... - то сначала будет залочена строка в master-таблице (TMX), а затем начнётся срабатывание триггера-каскада, который будет удалять строки в detail-таблице (TDX). Но на этой detail-таблице также есть триггер на before_delete_or_update (обычный, не каскад). И он вызывает уже обработку строк в таблицах-"внуках". Таким обр., когда дело доходит до обработки строк таблиц-"внуков" (TQ1 & TQ2), их родительская строка в TDX уже залочена . Кроме того, логика работы исключает доступ к отдельным строкам таблиц-"внуков", минуя обработку их родительской строки: в коде нет операторов "прямого доступа" к TQx, в т.ч. инсертов в них. Почему тогда получаются такие "эффекты", как было показано выше ? Как можно "пробиться" к стейтменту вида: Код: plaintext 1. 2.
ЗЫ. И еще: если бы всё упиралось только в "надтранзакционность ключей", то всё легко можно было бы воспроизвести без гемора типа открытия 100 окон. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 14:07 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
ТаблоидЕсли я делаю: delete from <master> where id = ... - то сначала будет залочена строка в master-таблице (TMX)Нет конечно Напоминаю краткий порядок работы апдейта 1. чтение записи 2. вычисление новых значений (то, что написано в UPDATE ... SET <>) 3. триггеры before 4. физический апдейт 5. триггеры after Как видишь, "залочена" строка будет только после триггеров before ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 14:13 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
hvladНапоминаю краткий порядок работы апдейта 1. чтение записи 2. вычисление новых значений (то, что написано в UPDATE ... SET <>) 3. триггеры before 4. физический апдейт 5. триггеры after Как видишь, "залочена" строка будет только после триггеров before Гут. А теперь делаю вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Запускаю 80 молотилок, жду 5-10 минут. И получаю то же самое. Это чем объяснить ? ЗЫ. Получил сиё на первом варианте DDL, который приведен в стартовом посте (и который с "ошибкой проектирования"; сделал так потому, что на нём эффект проявляется быстрее всего). ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 15:03 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
ТаблоидЭто чем объяснить ?Я не вникал в твой тест. См. выше 16431065 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 15:12 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
ТаблоидТо есть, сначала делаю явный лок master-записи, и только после - её апдейт или удаление, что уже вызовет каскадный триггер на детали (tdx) и далее на "внуков" (tq1 & yq2). Этот лок мастер-строки должен (вроде) гарантировать, что НИКТО не сможет добраться до строк таблицы tdx и соотв-щих строк "внуков", пока текущая транзакция, залочившая мастер-строку, не закоммитится или не откатится.С чего бы это ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 15:13 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
hvladТаблоидТо есть, сначала делаю явный лок master-записи, и только после - её апдейт или удаление, что уже вызовет каскадный триггер на детали (tdx) и далее на "внуков" (tq1 & yq2). Этот лок мастер-строки должен (вроде) гарантировать, что НИКТО не сможет добраться до строк таблицы tdx и соотв-щих строк "внуков" , пока текущая транзакция, залочившая мастер-строку, не закоммитится или не откатится.С чего бы это ?Если твой вопрос про выделенную фразу, то... что в ней неожиданного ? Код: plaintext 1.
Script (file = 'rq'): Код: plaintext 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.
PS. Кстати, на одном из выполнений этого "драматического сценария" ФБ.... завалился с багчеком (при вызове в session #2 скрипта`rq`). В логе: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Бактрассу могу прислать, если нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 15:26 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
hvladТаблоидЭто чем объяснить ?Я не вникал в твой тест.Ну вот же, смотри, всё просто: Код: plaintext 1. 2. 3. 4.
Теперь делаю так: Код: plaintext 1. 2.
Кто и как сможет подобраться к строкам в TQ1 & TQ2, которые подчинены строкам в TDX, а те - подчинены залоченной сейчас строке в TMX, - если я буду держать незакоммиченной транзакцию, которая выполнила "синенькие " стейтменты ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 15:35 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
ТаблоидЕсли твой вопрос про выделенную фразу, то... что в ней неожиданного ?Каким боком "лок мастер-строки" должен что-то гарантировать про строки в детальных таблицах ??? Каким боком твой пример с конкурентным апдейтом одной таблицы относится к проблемам отцов и детей ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 15:46 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
ТаблоидКстати, на одном из выполнений этого "драматического сценария" ФБ.... завалился с багчеком Это известный побочный эффект стабильности курсора в сочетании с double update. У Влада всё руки не доходят его пофиксить. Так что ты проверь где ты из триггеров апдейтишь ту же запись, которая уже была изменена основным запросом. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 15:52 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
hvladТаблоидЕсли твой вопрос про выделенную фразу, то... что в ней неожиданного ?Каким боком "лок мастер-строки" должен что-то гарантировать про строки в детальных таблицах ??? Каким боком твой пример с конкурентным апдейтом одной таблицы относится к проблемам отцов и детей ???Дык посмотри в код, плз: я НЕ делаю никаких явных (в ХП или в EB) апдейтов или удалений в "детях" и "внуках". Это делают триггеры. Как раз при апдейте или удалении одной строки мастер-таблицы. Прочитав вот это:hvlad1. чтение записи 2. вычисление новых значений (то, что написано в UPDATE ... SET <>) 3. триггеры before 4. физический апдейт 5. триггеры after Как видишь, "залочена" строка будет только после триггеров before - я решил предотвратить конкуретный доступ before-треггеров к одним и тем же строкам деталь-таблицы (TDX). Для этого: 1) добавил select from TMX for update with lock; 2) в before-update-delete триггере таблицы TMX - добавил аналогичный for update with lock для всей группы подчинённых мастеру строк таблицы TDX. Объясни мне прямо, по-пролетарски: этого разве не достаточно для сериализации обращений к деталь-строкам ? И если не достаточно, то как она, сериализация эта, может быть нарушена ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 15:59 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovТаблоидКстати, на одном из выполнений этого "драматического сценария" ФБ.... завалился с багчекомЭто известный побочный эффект стабильности курсора в сочетании с double update.Воспроизводится трудно (надо повторять в двух окнах по нескольку раз: "SQL> in rq;", затем выйти из обоих окон, снова зайти и опять попытаться - тогда, возможно , ФБ опять завалится; в общем, танцы с бубном). Dimitry SibiryakovТак что ты проверь где ты из триггеров апдейтишь ту же запись, которая уже была изменена основным запросом.Это как это ?! даже если бы я запускал транзакции не с NO wait, а с LOCK TIMEOUT nn, они бы сразу по лбу получали в ввиду того, что запись уже была обновлена и изменений закоммичено... Здесь вам не орацле, где по-тихому всё перетирается :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 16:07 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
ТаблоидВоспроизводится трудно Воспроизводится легко: create table t... create trigger tt after update t .... update t ... where id=new.id; ... Всё, почти любой update этой таблицы приведёт к багчеку. Тот же механизм, что и в CORE-4369. ТаблоидЭто как это ?! Это как выше. Другим транзакциям - облом, но этой же - всё дозволено. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 16:18 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovТаблоидЭто как это ?!Это как выше. Другим транзакциям - облом, но этой же - всё дозволено.Ты про то, может ли транзакция несколько раз проапдейтить один и тот же документ ? Я добавил контроль на это, введя GTT'шку, в которую транзакция складывает уже обработанные документы: Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 16:47 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovВоспроизводится легко: create table t... create trigger tt after update t .... update t ... where id=new.id; ...Это рекурсия, бесконечная. Воспроизводится легко, подтверждаю ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 17:09 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
hvladDimitry SibiryakovВоспроизводится легко: create table t... create trigger tt after update t .... update t ... where id=new.id; ...Это рекурсия, бесконечная. Воспроизводится легко, подтверждаюгы... только сейчас вгляделся, что делает этот триггер :-) Но у мну нет такого изврата: "апдейтить самого себя на событие апдейта" 2 hvlad: ну так объясни, плз, про мои сериализационные потуги : как там может быть такое, что две транзакции одновременно дёргают before-триггера деталей, при том что обе они предварительно должны выполнить select for update with lock строки мастер-таблицы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 17:26 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
Таблоидну так объясни, плз 16431597 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 17:35 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
ТаблоидНо у мну нет такого изврата: "апдейтить самого себя на событие апдейта" Этот изврат не обязан быть непосредственным и рекурсия не обязана быть бесконечной. Всё дело в волшебных пузырьках ловкости рук. Твои схемы имеют привычку перерастать в can of spaghetti где легко не заметить какой-нибудь побочный эффект. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 17:38 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
hvlad 16431597 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 17:44 |
|
Нарушение PK при интенсивном обмене данными между таблицами. Не могу понять причину.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovТвои схемы имеют привычку перерастать в can of spaghetti где легко не заметить какой-нибудь побочный эффект.Ну вот скажи мне: где в этой "картинке" может быть побочный эффект ? Просто, В ТУПУЮ, выполняю сначала явный лок мастер-строки (table TMX), затем - апдейт её. При этом before update триггер этой мастер-строки делает такую же ТУПЕЙШУЮ вещь: ставит явные локи на все подчинённые деталь-строки (table TDX). И только затем идут уже обмены кортежами между таблицами-"внуками" (см триггер tdx_bud for tdx active before update or delete). ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2014, 17:49 |
|
|
start [/forum/topic.php?fid=40&msg=38718127&tid=1562379]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 262ms |
total: | 415ms |
0 / 0 |