|
|
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Есть 2 таблицы. Код: 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. И сразу же начинаю инсертить в СХЕМА.ZZZ (причем id указываю существующий, т.е. должен получить ошибку). Так вот ошибка вылазит только после того, как закончится создание fk-констрейнта. Получается, создание fk-констрейнта на СХЕМА.YYY блокирует любой dml в нее? Единственный обход - NOVALIDATE? Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 20:31:49 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
140907, Думаю, если "вылазит ошибка", то надо привести текст этой самой ошибки. И сразу же начинаю инсертить непонятно, инсертить начинаешь до того как скрипт ДДЛ проиграет полностью ? В другой сессии ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 20:56:00 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
Ярослав Батозский, Ошибка про то, что строка с таким id уже существует. Делаю так специально. Создание fk-констрейнта запускаю в первой сессии. Инсерт делаю во второй сессии во время создания fk-констрейнта. Инсерт висит, а как только создание fk-констрейнта завершается - выдает ожидаемую ошибку. Получается, если таблица СХЕМА.YYY большая, и в нее постоянно идут инсерты-апдейты, то единственный способ не нарушить нормальный ход вещей - использовать слово NOVALIDATE при создании fk-констрейнта? В таблицу СХЕМА.YYY инсерты-апдейты идут почти круглосуточно. Перерыв есть - полчаса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 01:02:59 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
В 11.2 (точнее с 11.1.0.6 ?) в очередной раз изменилось поведение блокировок для констрейнта FOREIGN KEY Теперь на время создания (проверки валидности) вешается (пытается, по крайней мере) SHARE (S) TM блокировка на родительскую и дочернюю таблицу, что запрещает изменение родительской и дочерней таблицы нельзя построить констрейтн, пока по родительской или дочерней таблице есть незавершенная транзакция (в том числе и непрямая странная блокировка проскочила ) Хоть и заведен "Bug 8881121 : CHANGE TO DML LOCK MODES FOR FOREIGN KEY CONSTRAINTS", но теперь это считается expected behavior ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 04:31:52 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 20:35:33 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, респект ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 03:28:15 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, https://docs.oracle.com/cloud/latest/db112/SQLRF/clauses002.htm#SQLRF52180 ENABLE NOVALIDATE ensures that all new DML operations on the constrained data comply with the constraint. This clause does not ensure that existing data in the table complies with the constraint. ... If you change the state of any single constraint from ENABLE NOVALIDATE to ENABLE VALIDATE, then the operation can be performed in parallel, and does not block reads, writes, or other DDL operations . Т.е. сначала я создаю на колонке YYY.ZZZ_ID констрейнт с ENABLE NOVALIDATE (создание констрейнта происходит быстро и не блокирует dml в YYY). Потом перевожу этот констрейнт в состояние ENABLE VALIDATE (проверка выполняется, но не блокирует dml в YYY). Вроде так. Надо попробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 12:22:01 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
140907Потом перевожу этот констрейнт в состояние ENABLE VALIDATE (проверка выполняется, но не блокирует dml в YYY)Блокирует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 12:55:07 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, Возможно, блокирует. Но dml идет. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 13:39:27 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
Хм А вот здесь, кстати, интересный момент Действительно, при VALIDATE оно не держит блокировку постоянно, а пытается получить ее перед валидацией и непосредственно после окончания Если ты в этом промежутке вставил и закоммитил записи -- все пролазит Если не подтвердил -- валидация обломится Т.е. поведение как в 10-ке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2016, 14:44:44 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, Похоже, в этом промежутке можно вставлять и не коммитить. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2016, 12:29:02 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
И такое поведение, наверно, логично (иначе завершить валидацию на таблице, в которую постоянно идет dml, было бы очень затруднительно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2016, 12:31:35 |
|
||
|
Add constraint foreign key блокирует таблицу?
|
|||
|---|---|---|---|
|
#18+
140907Похоже, в этом промежутке можно вставлять и не коммитить. Ты уверен, что вторая сессия у тебя не завершилась, отработав? Или там не стоит какой-нибудь AutoCommit ? Потому как у меня не воспроизводится подготовка Код: 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. Незавершенная транзакцияИ поехали, сначала натыкаемся на первую блокировку: Сессия 2: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Сессия 1: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Сессия 2: Код: 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. Сессия 1: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Завершенная транзакция Сессия 1: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Сессия 2: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Сессия 1: Код: plsql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2016, 09:48:40 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39268327&tid=1887935]: |
0ms |
get settings: |
8ms |
get forum list: |
24ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
185ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 192ms |
| total: | 483ms |

| 0 / 0 |
