ProstgreSQL, оптимистичный параллелизм MySQL - PullRequest
4 голосов
/ 31 января 2011

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

Ответы [ 3 ]

3 голосов
/ 31 января 2011

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

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

2 голосов
/ 31 января 2011

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

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

0 голосов
/ 31 января 2011

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

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

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

...