ëÁÞÁÎÏ×ÓËÉÊ äÍÉÔÒÉÊ wrote:
Ну вот опять, сначала написал, а потом понял что снова поторопился... опять неправильно поймут :)

вот эту строчку

2. (wait) дождаться когда будет можно и выполнить

правильно читать так

2. (wait) дождаться когда будет можно будет выполнить операцию над всем множеством (естественно не блокируя его на время ожидания) и выполнить

это было понятно, но чего ты этим хочешь добится? в общем случае проблему deadlock ты не решил, поскольку в одной транзакции можно использовать несколько update. ну да, в твоем конкретном случаее это бы решило твою проблему _если_ сразу после update сделать commit. если этого не сделать, то на deadlock ты нарвешся в каком-то другом update.

так что единственное, что тебе поможет - заблокировать записи _в начале_ транзакции (это должен быть действительно самый первый оператор в транзакции), а уже потом делать update. это так называемый two-phase locking.

если ты не в курсе, то у нас update some_table set pk = pk + 1 приведет к нарушению уникальности ключа (а в других серверах - нет), а это более серьезная проблема чем твоя, но ее еще не решили, поскольку не все так тривиально.

так что ответ на твой вопрос: "да, было бы логичнее, но нет, пока все остается так как было да и проблему твою решать надо по другому".

Роман

Ответить