php并发控制 , 乐观锁

摘要:
悲观的锁在读取开始时就开始锁定,因此在大型并发访问的情况下,性能会更差。对于MySQL Inodb,通过指定显式主键来搜索数据将锁定单行,而查询范围操作或非主键操作将锁定表。接下来,让我们看看如何使用乐观锁来解决这个问题。MYSQL首先将更新列添加到计数器表_时间字段。执行操作时,先前读取的更新_时间和当前表中的更新_在时间执行比较。如果一致,则允许该操作,然后生成一个新的更新_time值替换表中的原始更新_time

由于悲观锁在开始读取时即开始锁定,因此在并发访问较大的情况下性能会变差。对MySQL Inodb来说,通过指定明确主键方式查找数据会单行锁定,而查询范围操作或者非主键操作将会锁表。 接下来,我们看一下如何使用乐观锁解决这个问题。

MYSQL

首先我们为counter表增加一列update_time字段,当进行操作时,将先前读取的update_time与当时表中的update_time进行一次对比,如果一致,那么允许操作,然后生成一个新的update_time值替换表中原有的update_time。

php代码 
  1. <?php   
  2. mysqli_query($conn, 'BEGIN');  
  3. $rs = mysqli_query($conn, 'SELECT num, version FROM counter WHERE id = 1');  
  4. mysqli_free_result($rs);  
  5. $row = mysqli_fetch_array($rs);  
  6. $num = $row[0];  
  7. $version = $row[1];//此例:新增version字段标记  
  8. mysqli_query($conn, 'UPDATE counter SET num = ' . $num . ' +1, version = version + 1 WHERE id = 1 AND version = ' . $version);  
  9. $affectRow = mysqli_affected_rows($conn);  
  10. if ($affectRow == 0 || mysqli_errno($conn)) {  
  11.     // 回滚事务重新提交  
  12.     mysqli_query($conn, 'ROLLBACK');  
  13. else {  
  14.     mysqli_query($conn, 'COMMIT');  
  15. }  

PHP文件乐观锁,在处理下单请求的时候,用flock锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙"

php代码 
    1. <?php  
    2. $fp = fopen("lock.txt", "w+");   
    3. if (flock($fp, LOCK_NB | LOCK_EX)) {  
    4.     echo 'do something';  
    5.     @flock($fp, LOCK_UN);  
    6. else {  
    7.     echo '系统繁忙';  
    8. }  
    9. @fclose($fp);  

免责声明:文章转载自《php并发控制 , 乐观锁》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇js图片全屏kafka connect 使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

搭建keepalived+mysql主从复制高可用

准备工作: 完成keepalived的安装 完成docker的安装 docker镜像里面自行安装iproute2, vim, iputils-ping(可选)等工具,便于测试apt-get install iproute2 apt-get install vim apt-get install iputils-ping 主数据库master 1....

docker安装MySQL5.7示例!!坑,ERROR 1045 (28000): Access denied for user

docker  pull  mysql拉取镜像 启动mysql需要做端口映射 -p 其他几个高级操作: Docker安装mysql5.7报错 ERROR 1045 (28000): Access denied for user 【tips】docker安装MySQL5.7ERROR 1045 (28000): Access denied for user...

MySQL 集群

MySQL Galera介绍主要功能: 同步复制 真正的multi-master,即所有节点可以同时读写数据库 自动的节点成员控制,失效节点自动被清除 新节点加入数据自动复制 真正的并行复制,行级 用户可以直接连接集群,使用感受上与MySQL完全一致 优势: 因为是多主,所以不存在Slave lag(延迟) 不存在丢失交易的情况 同时具有读和写的扩展...

Mysql占用过高CPU时的优化手段

Mysql占用CPU过高的时候,该从哪些方面下手进行优化?占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processlist语句,查找负荷最重的SQL语句,优化该SQL,比如适当建立某字段的索引;2)打开慢查询日志,将那些执行时间过长且占用资源过多的SQL拿来进行explain...

在perl上装DBD:mysql 的问题

在perl上装DBD:mysql ,就这事弄了多半天。mysql实在是不咋地 首先,在装DBD:mysql模块时,make后打印出错误信息,如下:gcc: language strconst not recognized gcc: dbdimp.c: linker input file unused because linking not done gcc...

MySQL5.7 的新特点

1、安全性 MySQL 5.7 的目标是成为发布以来最安全的 MySQL 服务器,其在 SSL/TLS 和全面安全开发方面有一些重要的改变。 mysql.user表结构升级 MySQL5.7用户表mysql.user的plugin字段不允许为空,默认值是mysql_native_password,而不是mysql_old_password,不再支持旧密码格...