关于时间戳的困惑:并发问题的解决方案

时间:2013-10-25 13:26:38

标签: php mysql sql database database-concurrency

我正在开发一个网站,在进行数据库设计时,我对并发问题有些担心,我正在考虑使用时间戳来避免这种情况。

我对时间戳的理解是它以这种方式工作:

  1. 有一个字段让我们说“DateModified”,其中更新该特定行的每次更新。
  2. 然后,只要有一个或多个用户访问该行,就像先读取一样,然后最终更新它。
  3. 在我对时间戳进行深入研究时,我需要一个首先阅读“DateModified”的条件,就像在我的代码中一样。
  4. readdatemodified =从交易中选择DateModified,其中ID =?

    datemodified =从交易中选择DateModified,其中ID =?

    如果datemodified == readdatemodified 更新事务ID =? 其他 消息“有人更新了记录。请再试一次。”

    IF:成功更新记录

    ELSE:此处将通过访问数据库再次检索记录,以确保记录是更新的记录。

    我在这里解决了并发问题但我最关心的是如何访问数据库。 每次更新我都会多次访问数据库吗?

    有没有办法可以使用时间戳来最小化数据库访问?

2 个答案:

答案 0 :(得分:0)

您是否考虑过不使用时间戳,而是使用事务和锁定读取:

http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

这可能是解决您问题的更好方法。 MySQL 'select for update' behaviour显示了问题中的一些行为示例。

锁定提供的功能取决于您使用的基础数据库引擎:

  • MyISAM - 表级锁定
  • InnoDB - 行级锁定

可在MySQL网站上找到有关功能和优势的详细说明:http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html

答案 1 :(得分:0)

如果你想要应用程序逻辑中的并发/检查,那么尝试使用CAS(检查和设置)算法,如果你想要不发生并发更改,请使用事务(如非循环Tau所述)