php并发控制 , 乐观锁

由于悲观锁在开始读取时即开始锁定,因此在并发访问较大的情况下性能会变差。对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);
时间: 2024-10-05 23:07:59

php并发控制 , 乐观锁的相关文章

[转]数据库并发控制 乐观锁,悲观锁

在数据库中,并发控制有乐观锁和悲观锁之间,什么时候用乐观锁比较好什么时候用悲观锁比较好? 实际生产环境里边,如果并发量不大,完全可以使用悲观锁定的方法,这种方法使用起来非常方便和简单.但是如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以就要选择乐观锁定的方法. 悲观锁假定其他用户企图访问或者改变你正在访问.更改的对象的概率是很高的,因此在悲观锁的环境中,在你开始改变此对象之前就将该对象锁住,并且直到你提交了所作的更改之后才释放锁.悲观的缺陷是不论是页锁还是行锁,加锁的时间可能会很长

[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁

注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段. 无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想.其实不仅仅是关系型数据库系统中有乐观锁和悲观锁的概念,像memcache.hibernate.

深入理解乐观锁与悲观锁

在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段. 无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想.其实不仅仅是数据库系统中有乐观锁和悲观锁的概念,像memcache.hibernate.tair等都有类似的概念. 针对于不同的业务场景,应该选用不同的并发控制方式.所以,不要把乐观并发控制和悲

数据库事务的悲观锁和乐观锁

转载出处:http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段. 无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想.其实不仅仅是关系型数据库系统中有乐观锁和悲观锁的概念,像memcache.hibernate.tair

【转】深入理解乐观锁与悲观锁

在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段. 无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想.其实不仅仅是关系型数据库系统中有乐观锁和悲观锁的概念,像memcache.hibernate.tair等都有类似的概念. 针对于不同的业务场景,应该选用不同的并发控制方式.所以,不要把乐观并发控

并发控制:(二)乐观锁 悲观锁

悲观锁:(pessimistic locking):假定:发生冲突的概率比较高,实现:在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking).这样其他事务如果想操作该记录,需要等待锁的释放特点: 当并发量较大,频繁访问时,等待时间较长,并发访问性不好例如: java的synchronized,SqlServer页级锁,Oracle行级锁 乐观锁:(optimistic locking)假设:发生冲突的概率比较低实现:在提交对记录的更改时才将对象锁住,提交前需要检查

25.partial update内置乐观锁并发控制

主要知识点 (1)partial update内置乐观锁并发控制 (2)retry_on_conflict post /index/type/id/_update?retry_on_conflict=5&version=6 一.一般情况下partial update实现过程 用户直接修改field,然后发送给应用程序,由应用程序直接发送给ES,和全量替换相比,全量替换要先去es进行查找,把查找的数据返回给应用程序,然后再次返回给用户界面,只有这样用户才知道要替换什么,partial update

ElasticSearch(九)基于version进行乐观锁并发控制

一.基于version进行乐观锁并发控制 1).查看一条document GET /test_version/test_version_type/1 { "_index" : "test_version", "_type" : "test_version_type", "_id" : "1", "_version" : 1, "found" : t

ElasticSearch 并发冲突+悲观锁与乐观锁+基于_version和external version进行乐观锁并发控制

1.图解剖析Elasticsearch并发冲突问题 2.图解剖析悲观锁与乐观锁两种并发控制方案 3.图解Elasticsearch内部如何基于_version进行乐观锁并发控制 (1)_version元数据 PUT /test_index/test_type/6{ "test_field": "test test"} { "_index": "test_index", "_type": "test

乐观锁是基于比较的无锁并发控制机制

乐观锁是基于比较的无锁并发控制机制. CAS mvcc The general idea is this: Optimistic locking Each table you want to implement concurrent access to need a new column: Version. This column is usually an integer or a timestamp. Every time a record in the table changes, its