【问题标题】:Do I need to lock my record while I process data to avoid inconsistency?我是否需要在处理数据时锁定我的记录以避免不一致?
【发布时间】: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


【解决方案1】:

据我所知,PHP 中没有线程,但 API 像 pthreads http://www.php.net/manual/en/intro.pthreads.php

可用于线程:

它包括创建多线程所需的所有工具 应用

顺便说一句,这个问题在 SO 上讨论了很多......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多