thinkphp继承高级model后的乐观锁运用(测试中)

 1 <?php
 2 class IndexAction extends Action {
 3     private $d_user;
 4     private $user;
 5     private $arr;
 6
 7     public function __construct(){
 8         parent::__construct();
 9         $this->d_user = D(‘User‘);
10         $this->user = M(‘user‘);
11
12         //打款的配置信息
13         $this->arr = array(
14             ‘userA‘ => 1,
15             ‘userB‘ => 2,
16             ‘money‘ => 300
17         );
18     }
19
20     /**
21      * 打款逻辑(事务操作)
22      */
23     public function index(){
24         $this->user->startTrans();
25         $this->moneyFill($this->user, $this->arr[‘userA‘], $this->arr[‘money‘]);
26
27         $data = array(‘id‘ => $this->arr[‘userA‘], ‘money‘ => array(‘exp‘,‘money - ‘ . $this->arr[‘money‘]));
28         $data2 = array(‘id‘ => $this->arr[‘userB‘], ‘money‘ => array(‘exp‘,‘money + ‘ . $this->arr[‘money‘]));
29
30         if($data = $this->d_user->lockTable($data)){
31             $res = $this->user->save($data);
32         }
33         if($data2 = $this->d_user->lockTable($data2)){
34             $res2 = $this->user->save($data2);
35         }
36
37         if($res && $res2){
38             $this->user->commit();
39             echo ‘commit‘;
40         }else {
41             $this->user->rollback();
42             echo ‘rollback‘;
43         }
44     }
45
46     /**
47      * 支出方金钱是否满足
48      */
49     private function moneyFill($user, $id, $money){
50         $current_money = $user->where(array(‘id‘ => $id))->getField(‘money‘);
51         if($current_money < $money){
52             echo ‘money no worth!‘;
53             exit;
54         }
55     }
56 }
 1 <?php
 2 /**
 3  * 用户表模型类
 4  */
 5 class UserModel extends AdvModel{
 6
 7     /**
 8      * 乐观锁操作
 9      */
10     public function lockTable($res){
11
12         //记录乐观锁
13         $res = $this->recordLockVersion($res);
14
15         //缓存当前线程的乐观锁
16         $this->cacheLockVersion($res);
17
18         //检查乐观锁并返回是否锁定
19         return $this->checkLockVersion($res, $options);
20     }
21 }
22 ?>
时间: 2024-08-25 13:01:11

thinkphp继承高级model后的乐观锁运用(测试中)的相关文章

乐观锁和悲观锁及CAS实现

乐观锁与悲观锁 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁.传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁.再比如Java里面的同步原语synchronized关键字的实现也是悲观锁. 乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制.乐

Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁.传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁.再比如Java里面的同步原语synchronized关键字的实现也是悲观锁. 乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版

一篇文章带你解析,乐观锁与悲观锁的优缺点

乐观锁与悲观锁 概述 乐观锁 总是假设最好的情况,每次去读数据的时候都认为别人不会修改,所以不会上锁, 但是在更新的时候会判断一下在此期间有没有其他线程更新该数据, 可以使用版本号机制和CAS算法实现. 乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁. 在Java中java.util.concurrent.atomic包下面的原子变量类就是基于CAS实现的乐观锁. 悲观锁 总是假设最坏的情况,每次去读数据的时候都认为别

[数据库事务与锁]详解八:底理解数据库事务乐观锁的一种实现方式——CAS

注明: 本文转载自http://www.hollischuang.com/archives/1537 在深入理解乐观锁与悲观锁一文中我们介绍过锁.本文在这篇文章的基础上,深入分析一下乐观锁的实现机制,介绍什么是CAS.CAS的应用以及CAS存在的问题等. 线程安全 众所周知,Java是多线程的.但是,Java对多线程的支持其实是一把双刃剑.一旦涉及到多个线程操作共享资源的情况时,处理不好就可能产生线程安全问题.线程安全性可能是非常复杂的,在没有充足的同步的情况下,多个线程中的操作执行顺序是不可预

乐观锁的一种实现方式——CAS

在java里面,synchronized关键字就是一种悲观锁,因为在加上锁之后,只有当前线程可以操作变量,其他线程只有等待. CAS操作是一种乐观锁,它假设数据不会产生冲突,而是在提交的时候再进行版本比较.这样可以减少加锁的频率,提高程序的性能. 线程安全 众所周知,Java是多线程的.但是,Java对多线程的支持其实是一把双刃剑.一旦涉及到多个线程操作共享资源的情况时,处理不好就可能产生线程安全问题.线程安全性可能是非常复杂的,在没有充足的同步的情况下,多个线程中的操作执行顺序是不可预测的.

innodb 悲观锁,乐观锁

转 http://www.cnblogs.com/chenwenbiao/archive/2012/06/06/2537508.html CREATE TABLE `products` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(256) NOT NULL, `quantity` int NOT NULL, `cityid` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `id

最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁

在Java并发场景中,会涉及到各种各样的锁如公平锁,乐观锁,悲观锁等等,这篇文章介绍各种锁的分类: 公平锁/非公平锁 可重入锁 独享锁/共享锁 乐观锁/悲观锁 分段锁 自旋锁 01.乐观锁 vs 悲观锁 乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用. 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制. 乐观锁适用于多

悲观锁和乐观锁的解读

悲观锁(Pessimistic Lock) 当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发.这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制(是因为这是一种对数据的修改抱有悲观态度的并发控制方式.我们一般认为数据被并发修改的概率比较大,所以需要在修改之前先加锁.又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”). 悲观锁主要是共享锁或排他锁 共享锁又称

【转】数据库的乐观锁和悲观锁

有时候为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突.为了解决这个问题,大多数数据库用的方法就是数据的锁定.所以说,悲观锁和乐观锁主要是用来,保证数据安全,处理多用户并发. 乐观锁:就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住. 悲观锁:认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息,让用户决定如何去做. 悲观锁会造成访问