php mysql 并发写入_PHP / MySQL并发-取决于读取的写入-关键部分

我有一个运行PHP MySQL的网站.它是一个多用户系统,大多数MySQL表都是基于MyISAM的.

在过去的几个小时里,以下情况使我感到困惑:

我有两个(并发)用户A,B.他们两个都将这样做:

>对表1执行读操作

>在另一个表2上执行写操作(仅当先前的读操作将返回不同的结果时,例如STATUS =“ OK”)

B稍微落后于A.

所以它会像这样发生:

>用户A对表1进行读取,并看到STATUS =“ OK”.

>(用户A计划在表2上写)

>用户B对表1进行了读取,仍然看到STATUS =“ OK”.

>用户A在表2上执行写操作(导致STATUS =“ NOT OK”不再存在)

>用户B对表2执行写操作(假设STATUS =“ OK”)

我认为,如果将“读取表1”和“写入表2”定义为关键部分并自动执行,则可以避免这种情况.我知道这在带有线程等的Java中可以很好地工作,但是据我所知,在PHP中没有线程通信.

因此,解决我的问题的方法必须与数据库有关,对吗?

有任何想法吗?

非常感谢!

解决方法:

正确的方法:使用InnoDB和transactions.

错误但可行的方法:在执行数据库操作之前,请使用GET_LOCK() MySQL函数获取排他的命名锁.当您不知道时,请使用RELEASE_LOCK()释放该锁.由于只有一个客户端可以拥有特定的锁,因此这将确保“关键部分”中的脚本实例不会超过一个.

伪代码:

SELECT GET_LOCK('mylock', 10);

If the query returned "1":

//Read from Table 1

//Update Table 2

SELECT RELEASE_LOCK('mylock');

Else:

//Another instance has been holding the lock for > 10 seconds...

标签:critical-section,multithreading,concurrency,mysql,php

来源: https://codeday.me/bug/20191127/2076729.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值