в моем проекте с использованием java, ibatic и MySql.
Перед любым обновлением данных в базе данных я блокирую таблицу с помощью SELECT FOR UPDATE
запроса
eg: SELECT * FROM MEM_MST WHERE MEM_ID = #memId# FOR UPDATE
Это делает блокировку таблицы правильно. но проблема в том, например, если два клиента обновляют таблицу одновременно. первый блокирует таблицу и обновляет, а второй ожидает обновления до тех пор, пока блокировка не будет снята. После этого второй также обновляет данные. Итак, первые обновленные данные перезаписываются. См. следующее объяснение:
Time | Client 1 | Client 2
-------------------------------------------------
1 | SELECT FOR UPDATE |
2 | UPDATE | SELECT FOR UPDATE (Waiting)
3 | COMMIT | (Waiting)
4 | | UPDATE
5 | (Overwritten) | COMMIT
Таким образом, обновленные данные Клиента 1 теряются.
Чего я хочу, так это просто вернуть сообщение об ошибке Клиенту 2 вместо того, чтобы ждать, пока будет снята блокировка.
Подскажите, пожалуйста, как решить вышеописанную проблему.
P.S:
Я уже установил тайм-аут ожидания блокировки на 0 в переменных запуска, но все еще требуется около 2 секунд, чтобы сообщить сообщение «Превышен тайм-аут ожидания блокировки».
кроме того, SELECT FOR UPDATE NO WAIT
не работает в MySQL
IS_USED_LOCK()
. - person eggyal   schedule 12.05.2012