|
Как может Tx1 (TIL = SNAPSHOT) увидеть изменения от Tx2 (TIL = RC), где Tx2 > Tx1 ?
|
|||
---|---|---|---|
#18+
hi all Запустите у себя вот этот примерчик (а особо любопытные могут и трейс в отдельном окне; конечно, сначала надо подправить на свои host/port/path/file): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Первый исполняемый оператор после "красного" коммита вызовет старт двух транзакций: 1) til = snapshot, для DML, и у неё будет номер = 7; 2) til = read committed, для DDL, и у неё будет номер = 8. "Синенький" текст будет выполняться в транзакции с номером 8, причём сразу после окончания этого стейтмента будет тутже сделан commit: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Изменение, т.е. новый домен в словаре базы, должны будут видеть: 1) все транзакции с TIL = RC, стартовавшие до этой DDL'ной tx = 8, если вздумают перечитать данные словаря; 2) только те транзакции с TIL = snapshot, которые стартуют после этого commit'a Tx = 8. Транзакции с TIL = snapshot, имеющие Tx < 8, ни при каких обстоятельствах не должны видеть новый домен. А теперь - внимание, знатоки, вопрос: почему вышеприведенный скрипт отрабатывает без ошибок, если в нём оставить закомментаренным set autoddl off; после create domain dm_dts as timestamp; Я вижу в трейсе, что tx = 7, til = SNAPSHOT, спокойненько так юзает домен, который был создан в Tx = 8: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2015, 01:47 |
|
Как может Tx1 (TIL = SNAPSHOT) увидеть изменения от Tx2 (TIL = RC), где Tx2 > Tx1 ?
|
|||
---|---|---|---|
#18+
PS. Разумеется, проверка того, что snapshot-транзакция не видит 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2015, 01:57 |
|
Как может Tx1 (TIL = SNAPSHOT) увидеть изменения от Tx2 (TIL = RC), где Tx2 > Tx1 ?
|
|||
---|---|---|---|
#18+
в общем случае, уровень изоляции не распространяется на метаданные (их использование ядром) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2015, 10:08 |
|
Как может Tx1 (TIL = SNAPSHOT) увидеть изменения от Tx2 (TIL = RC), где Tx2 > Tx1 ?
|
|||
---|---|---|---|
#18+
пфф... кшмар. А еще вот это как объяснить: Код: plaintext
- если его раскомментарить, то вылезет вполне ожидаемая ошибка: транзакция-7 (snapshot!), выполняющая execute block, не видит результат коммита транзакции-8, выполнившей DDL 'create domain'. Но как может влиять раскомментаривание "set audoddl off" на: 1) DML-транзакцию 2) на результат стетйтмента, который был запущен в (DML) транзакции, стартовавшей _до_ этого 'set autoddl off' ?! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2015, 10:40 |
|
Как может Tx1 (TIL = SNAPSHOT) увидеть изменения от Tx2 (TIL = RC), где Tx2 > Tx1 ?
|
|||
---|---|---|---|
#18+
при включенном AUTODDL все DML препарируются в контексте DDL-транзакции, а выполняются в контексте своей транзакции. При выключенном AUTODDL все DML и препарируются и выполняются в своей собственной транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2015, 11:53 |
|
|
start [/forum/topic.php?fid=40&fpage=75&tid=1562777]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 159ms |
0 / 0 |