并发控制 加乐观锁

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

MYSQL

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

Java代码  

  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锁定一个文件,如果锁定失败说明有其他订单正在处理,此时要么等待要么直接提示用户"服务器繁忙"

Java代码  

  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-30 17:12:54

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

自己写的在服务器上一段重试次数的程序,对于TAIR操作需要加乐观锁版本号防止集群上数据安全

封装类 package aa; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class TairMethodWrapper { private static Map<String, TairRetryEntry> superdealCache = new ConcurrentHashMap(); public static interface SuperdealTairMethodWra

详解 hibernate 悲观锁 乐观锁 深入分析 代码实例

首先,为什么要有锁这种概念和技术呢? 什么是锁( locking ) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数据再发生变化.此时,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的 "锁" ,即给我们选定的目标数据上锁,使其无法被其他程序修改.Hibernate 支持两种锁机制:

mysql悲观锁以及乐观锁总结和实践

注:本文乃转载,原文作者@青葱岁月 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据).   使用场景举例:以MySQL InnoDB为例 商品goods表中有一个字段status,status为1代表商

【hibernate框架】使用hibernate实现悲观锁和乐观锁

四种隔离机制不要忘记:(1,2,4,8) 1.read-uncommitted:能够去读那些没有提交的数据(允许脏读的存在) 2.read-committed:不会出现脏读,因为只有另一个事务提交才会读取来 结果,但仍然会出现不可重复读和幻读现象. 4.repeatable read:MySQL默认.可重复读,读数据读出来之后给它加把锁, 其他人先别更新,等我用完了你再更新.你的事务没完,其他事务就不可能改这条记录. 8.serializable:序列化,最高级别.一个一个来,不去并发.效率最低

请教Hibernate乐观锁和悲观锁相关问题

问题描述 1.这两个锁仅仅是用来解决并发的问题, 防止多人同时操作同一数据造成错误的吗? 2.如果只是用来解决并发操作同一数据的问题, 数据库的隔离级别不就是干这个的吗, 那 乐观锁和悲观锁还有什么意义? 3.是不是隔离级别和锁用一种就可以了, 因为他们解决的是同一种问题 解决方案 隔离级别控制的是事务之间允许并发的程度(这样说可能不太准确,请google 一下read uncommit, read commited, repeatable, serialize几种隔离级别以及相应的案例就清楚了

悲观锁与乐观锁

1.场景 并发更新数据,若不加锁可能导致新数据被老数据覆盖. 2.思想 乐观锁,其实就是不加锁.它有乐观的态度,认为"我操作的数据没有被别人更新".提交时万一发现已被修改就回滚. 悲观锁,悲观的态度,数据时时刻刻都会被更新,我就先将其先锁住,让别人用不了,我操作完成后再释放掉. 3.实现 乐观锁.为数据维护一个版本号(如在表中多加一列),当被更新时版本号自增.获取数据时同时拿到数据本身及当前版本号,若提交前数据被别人更新,那么在提交时服务端发现版本号过低就不提交. 悲观锁.需要数据库级

浅析Sql server锁,独占锁,共享锁,更新锁,乐观锁,悲观锁_MsSql

锁有两种分类方法.(1) 从数据库系统的角度来看锁分为以下三种类型: •独占锁(Exclusive Lock)独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受.执行数据更新命令,即INSERT. UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁.但当对象上有其它锁存在时,无法对其加独占锁.独占锁一直到事务结束才能被释放. •共享锁(Shared Lock)共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它.在SELECT 命令执行时,

深入理解Yii2.0乐观锁与悲观锁的原理与使用

本文介绍了深入理解Yii2.0乐观锁与悲观锁的原理与使用,分享给大家,具体如下: Web应用往往面临多用户环境,这种情况下的并发写入控制, 几乎成为每个开发人员都必须掌握的一项技能. 在并发环境下,有可能会出现脏读(Dirty Read).不可重复读(Unrepeatable Read). 幻读(Phantom Read).更新丢失(Lost update)等情况.具体的表现可以自行搜索. 为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念. 这里我们都不作解释了,拿这些关键

浅析Sql server锁,独占锁,共享锁,更新锁,乐观锁,悲观锁

锁有两种分类方法.(1) 从数据库系统的角度来看锁分为以下三种类型: •独占锁(Exclusive Lock)独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受.执行数据更新命令,即INSERT. UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁.但当对象上有其它锁存在时,无法对其加独占锁.独占锁一直到事务结束才能被释放. •共享锁(Shared Lock)共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它.在SELECT 命令执行时,