ProstgreSQL, оптимистичный параллелизм MySQL

У меня есть веб-приложение, в котором пользователи могут одновременно изменять данные. На данный момент я включаю старые значения строки в каждую форму и обновляю строку, только если данные совпадают. С SQLite это единственный вариант. Это уродливо, и я думаю о переходе на другую базу данных SQL, если это обеспечит лучший способ сделать это. Есть ли в PostgreSQL или MySQL неявные временные метки строк или номера версий, которые можно использовать вместо них?

3 ответа

Использование числового счетчика лучше, чем использование метки времени. Какой бы точной ни была метка времени, возможно, что две версии данных могут быть зафиксированы одновременно и получить одну и ту же метку времени. Используя числовой счетчик (например, update mytable set counter=counter+1, data=? where id=? and counter=?) затем каждый раз, когда строка изменяется, она получает уникальное значение счетчика. (Укажите исходное значение счетчика в предложении where, если данные были изменены кем-то другим, строки не будут сопоставлены.)

Хотя это не "неявное" решение, я думаю, что все в порядке. В библиотеках, таких как Hibernate, есть средства, позволяющие вам делать подобные вещи автоматически, поэтому вашему коду не нужно беспокоиться об этом.

MySQL имеет TIMESTAMP тип данных, который может быть использован для этой цели, в сочетании с DEFAULT CURRENT_TIMESTAMP а также ON UPDATE CURRENT_TIMESTAMP ограничения.

В PostgreSQL в каждой таблице есть "скрытое поле" xmin это может быть использовано для определения версии строки.

AFAIK, для получения метки времени обновления в Postgres требуется триггер, смотрите этот очень похожий вопрос:

Обновление отметки времени при обновлении строки в PostgreSQL

Этот вопрос (и ответ Эрика) указывают на то, что MySQL поддерживает этот триггер без запуска.

Другие вопросы по тегам