【发布时间】:2017-02-10 12:54:50
【问题描述】:
全部,
我在我的应用程序中使用 MySql 5.7。我试图使我的保存功能并发安全。我将举例说明。
示例: 我有两个管理员用户 Admin 1 和 Admin 2。我们有一个产品表,我们有一个产品表条目,产品代码为“P1”。假设 Admin 1 和 Admin 2 登录到系统并尝试同时使用代码“P1”更新产品条目。
我需要通知其中一位用户您正在尝试修改的记录正在由另一位用户更新,并在一段时间后重试。
我正在使用事务并且没有更改 MySql 的默认事务级别(可重复读取)。我正在尝试通过使用“SELECT FOR UPDATE”来解决它(包括一个 where 条件来检查修改时间)。这个“where”条件将解决那些已经提交的事务的并发问题。但是如果两个事务同时启动并且第一个事务在锁超时之前被提交,那么当第二个事务执行时,它会覆盖第一个事务。
欢迎分享你的想法
提前致谢
【问题讨论】:
-
您可以在临界区出现之前执行
LOCK TABLES product WRITE。之后别忘了解锁。 -
@apokryfos 锁定整个表以完成单个记录的编辑并不是真正有效的解决方案
-
我想这可能是解决方案之一:使用 InnoDB 引擎和
select ... for update -
有一种古老的技术是在表中创建一个版本字段。每次更新注册表时,它都会有版本,因此管理员 1 将拥有版本 1,管理员 2 也将拥有版本 1,当其中一个更新注册表时,通过触发器增加版本(检查它是否是相同版本)当管理员 2 尝试更新触发器时,将检查版本是否已过时并抛出异常。
标签: php mysql validation concurrency