【发布时间】:2016-09-10 15:56:55
【问题描述】:
我担心防止并发写入相同的数据。 (PHP + MySQL)
我有一个简单的流程:
选择一条记录 -> 在 PHP 中处理数据 -> 更新记录
我的噩梦场景(参见下面的示例)是 User1 和 User2 都从数据库中提取相同的记录,并且都更改并写回记录...导致其中一个用户的更改被洗掉而不被发现.
是否可以在“单线程”模式下运行 PHP,这会将两个用户的操作排队?
谢谢!
编辑:
为了让事情更清楚,这是我要避免的情况:
- 用户 1 从 DB (SELECT) 获取数据 v1
- 用户 2 从 DB (SELECT) 获取数据 v1
- 用户 1 生成数据 v1.1 (PHP)
- 用户 2 生成数据 v1.1' (PHP)
- 用户 1 更新数据(更新:v1.1 在数据库中)
- 用户 2 更新数据并擦除数据 v1.1(更新:v1.1' 在 DB 中)
所以我想确保在用户 2 获取数据之前,用户 1 已经更新了它。我不知道这是否是事情的自然规律,我无事可做,或者我是否需要设置一些锁。
【问题讨论】:
-
查看我的 Intention Locks 答案Here。它使用行级
INNODB锁定。锁定在 Line2 之后直到示例代码块中的COMMIT之后,该块非常小。使该块 snappy 用户 2 在该时间段内被阻止 -
PHP是单线程的,但是每次请求都会让PHP解析并执行脚本。
-
@CharlotteDunois 问题是关于数据的。没有人真正关心 PHP 发生了什么:p
-
@Drew 如果 PHP 修改了您在 DB 中的数据,我们关心 PHP :)
-
@Drew PHP 与 PHP 修改和更新数据库中的数据相关。
标签: php mysql sql multithreading synchronization