|
|
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
ТаблоидhvladНе потому ли, что кто-то не понимает уровней изоляции тр-ций и принципов конкурентного программирования ?Что именно я не понимаю в TILВот эта фраза тебя выдаёт: ТаблоидНо сам стейтмент от session #1 начался *ДО* этого коммита от session #2, так почему он вправе еще и МЕНЯТЬ запись, перетирать её ?это может спросить только тот, кто не понимает, что такое изоляция и как она меняется с уровнем Таблоидпричём тут "принципы конкурентного программирования" ?Али у тебя нет конкурирующих процессов ? PS сначала я просто плакалЬ, сейчас начну рыдать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2014, 17:44:24 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
Таблоид, ну так no_rec_version - нельзя читать старую версию , пока для нее существует не-коммиттед-версия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2014, 17:44:27 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
kdvВедь select for update - это update , никаким другим способом "заблокировать" запись в ФБ нельзя.Это НЕ апдейт, а только блокировка для последующего апдейта. Если селект включал в себя не только "id = :some_PK_value", но еще и доп. условие на то поле, что мы собираемся менять, то при изменении коннектом-конкурентом этого поля запись НЕ будет найдена. Если же селект был просто с "where id = :....", то запись после получения надо заново перечитать, т.к. поле может запросто быть уже с другим значением. В обоих случаях - лишний код. Мну кажется, что логичнее было бы выбрасывать ошибку при этом, как при апдейте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2014, 17:45:23 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
hvladPS сначала я просто плакалЬ, сейчас начну рыдатьЛадно. Я понял, что объяснений не будет. Пойду рыдать дальше над update t set id=id where id = :my_selected_id :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2014, 17:48:14 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
ТаблоидЯ понял, что объяснений не будет.а) я таки надеюсь на то, что ты сам поймёшь, тем более что вся информация тут уже озвучена - осталось её прочитать б) я физически не в состоянии объяснять каждый твой "вспых", особенно в моменты обострений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2014, 17:53:03 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
ТаблоидЭто НЕ апдейт Это и ЕСТЬ апдейт, только без срабатывания триггеров. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2014, 18:12:53 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, насколько я понял, Таблоид и хочет, чтобы это был НЕ апдейт, а "блокировка". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2014, 18:20:20 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
kdvнасколько я понял, Таблоид и хочет, чтобы это был НЕ апдейт, а "блокировка".Не, я хотел, чтобы select for update with lock вываливал ошибку 'update conflict', если после того, как он дождётся нужной записи, окажется, что в ней изменено какое-то поле (из тех, что НЕ присутствуют во where-предикате этого селекта, разумеется; иначе он её вообще не увидит :)). То есть, чтобы он вёл себя строго так же, как update при rc rec_ver. Но теперь понимаю, что этого нельзя сделать. Впрочем, это и к лучшему. Конструкция вида Код: sql 1. 2. - вполне себе подойдёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2014, 19:27:03 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
Таблоидkdvнасколько я понял, Таблоид и хочет, чтобы это был НЕ апдейт, а "блокировка".Не, я хотел, чтобы select for update with lock вываливал ошибку 'update conflict', если после того, как он дождётся нужной записи, окажется, что в ней изменено какое-то поле (из тех, что НЕ присутствуют во where-предикате этого селекта, разумеется; иначе он её вообще не увидит :)). То есть, чтобы он вёл себя строго так же, как update при rc rec_ver. Но теперь понимаю, что этого нельзя сделать. Впрочем, это и к лучшему. Конструкция вида Код: sql 1. 2. - вполне себе подойдёт. Долго медитировал над этим :) Имхо нужна функция, которая бы возвращала номер транзакции для записи (в режиме грязного чтения, т.к. для закоммиченых данных у записи уже есть поле rdb$record_version). Вот пример: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. И небольшое отвлечение: Ещё можно было бы простым запросом типа Код: sql 1. смотреть кто лочит записи. Если это сджойнить с таблицами мониторинга, то можно вытащить кто конкретно лочит, и откуда. И уже сейчас в тройке можно видеть кто последний менял запись, если вести логи коннектов и транзакций (на db-триггерах) :) Плохо только что после B/R это ломается... Может всё-таки возможно при B/R не обнулять счётчик транзакций и счётчик коннектов? И чтобы поле rdb$record_version переживало B/R? Просто мысли :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2014, 04:36:57 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
Таблоид> Впрочем, это и к лучшему. Конструкция вида Таблоид> update doc_list h set h.id = h.id where ... order by rand() Таблоид> - вполне себе подойдёт. Ты всерьёз собираешься писать такое в продакшен? P.S. Ещё начав читать предыдущий пост, я понял, что кончится "таблицами мониторинга". Но вот что он дойдёт до счётчиков транзакций и счётчиков коннектов с бэкап-ресторами - это даже предположить было сложно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2014, 05:25:09 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамТаблоид> Впрочем, это и к лучшему. Конструкция вида Таблоид> update doc_list h set h.id = h.id where ... order by rand() Таблоид> - вполне себе подойдёт. Ты всерьёз собираешься писать такое в продакшен?Не, ты чё! :-) Это же только для теста, да там после первичных проверок будет по-другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2014, 12:42:00 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамНо вот что он дойдёт до счётчиков транзакций и счётчиков коннектов с бэкап-ресторами - это даже предположить было сложно. Это ты пытаешься упрекнуть в чём? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2014, 12:42:54 |
|
||
|
RC: select for UPDATE with lock *не* выдаёт "update confl" при изменении записи другой трн
|
|||
|---|---|---|---|
|
#18+
ТаблоидНе, я хотел, чтобы select for update with lock вываливал ошибку 'update conflict', если после того, как он дождётся нужной записи, окажется, что в ней изменено какое-то поле (из тех, что НЕ присутствуют во where-предикате этого селекта, разумеется; иначе он её вообще не увидит :)).Вот тут ты снова заблуждаешься. Предикаты проверяются после того , как запись прочитана (было бы странно, если бы это было не так). "Блокировка" накладывается до того , как запись прочитана. Поэтому никак и никогда не может быть "что в ней изменено какое-то поле" - поля читаются у уже "заблокированной" записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2014, 13:38:18 |
|
||
|
|

start [/forum/topic.php?fid=40&gotonew=1&tid=1563796]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
185ms |
get topic data: |
7ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 477ms |

| 0 / 0 |
