В общем, я стараюсь работать с кратковременными блокировками, где я могу выполнить целую единицу работы за одну (сериализуемую) транзакцию; это устраняет необходимость в дополнительном механизме блокировки, так как блокировки db сделают все необходимое.
При работе с долговечными замками:
Для этой цели плохая идея использовать rdbms-блокировки - она просто не масштабируется. Столбцы с метками времени или версиями строк являются хорошим способом обеспечения оптимистичного параллелизма для предотвращения случайного перезаписи.
Чтобы опубликовать / применить тот факт, что строка редактируется, я бы сохранил идентификатор пользователя / имя пользователя блокирующего пользователя в столбце (ноль, если не заблокирован). Это позволяет понять, кому принадлежит строка, т. Е. Когда вы хотите отредактировать строку, сначала обновите ее, установив свой идентификатор пользователя (и убедитесь, что он еще не заблокирован).
Чтобы справиться с некорректно снятыми замками (из-за неисправного терминала и т. Д.), Есть 3 распространенных варианта:
- когда владелец замка снова входит в систему, разрешить ему взломать свои собственные блокировки
- разрешить администратору взломать блокировки пользователя
- сохранить столбец тайм-аута блокировки (datetime) и назначить запланированное задание, чтобы автоматически разблокировать просроченные строки
Итак, подведем итог - рассмотрим что-то вроде:
Foo
===
Id | ...data... | Timestamp | LockOwner | LockTimeout
---+------------+-----------+-----------+------------
и т.д.