PostgreSQL,MySQL乐观并发

时间:2011-01-31 17:57:31

标签: sql mysql postgresql concurrency optimistic-concurrency

我有一个Web应用程序,用户可以同时更改数据。目前,我在每个表单中包含旧行值,并且仅在数据相同时才更新行。使用SQLite这是唯一的选择。这很难看,如果能提供更好的方法,我会考虑切换到另一个SQL数据库。 PostgreSQL或MySQL是否有隐含的行时间戳或版本号,而不是可以使用?

3 个答案:

答案 0 :(得分:3)

使用数字计数器比使用时间戳更好。无论时间戳如何精确,都可以同时提交两个版本的数据并获得相同的时间戳。通过使用数字计数器(例如update mytable set counter=counter+1, data=? where id=? and counter=?),每次行变化时,它获得唯一的计数器值。 (在where子句中提供原始计数器值,如果数据已由其他人更改,则不会匹配任何行。)

虽然这不是一个“隐含”的解决方案,但我认为没关系。像Hibernate这样的库可以让你自动完成这类工作,所以你的代码不必担心它。

答案 1 :(得分:2)

MySQL与TIMESTAMPDEFAULT CURRENT_TIMESTAMP约束相结合时,ON UPDATE CURRENT_TIMESTAMP数据类型为can be used for this purpose

在PostgreSQL中,每个名为xmin的表都有一个“隐藏字段”,可用于确定行版本。

答案 2 :(得分:0)

AFAIK,在Postgres中获取更新时间戳需要触发器,请看这个非常相似的问题:

Update timestamp when row is updated in PostgreSQL

这个问题(和Eric的回答)指出MySQL支持这个没有触发器。