php - mysql有没有类似和memcached里那样的CAS版本控制?
巴扎黑
巴扎黑 2017-04-10 15:41:52
[PHP讨论组]

见http://php.net/manual/zh/memcached.cas.php
memcached的CAS是这么个原理:

首先cas token其实就是一个版本号,

1,我取一条数据时,会顺带返回一个版本号($casToken)给我:$data = $m->get('ip_block', null, $casToken);

2,然后我修改$data后,再回存这个$data时,我需要靠这个版本号才能存回去:$m->cas($casToken, 'ip_block', $data);

如果1、2过程之间已经有人存了$data,那么由于版本号$casToken已经发生变化,第2步就会失败。

有了CAS就可以保证数据最新,可以防止对有限的资源争夺时,由于并发缘故,导致的重复问题,比如我还剩1个手机出售,但却被3个人同时下了订单。

求教mysql有没有类似的东西。

//补充
事务加悲观锁,不能解决这个问题,比如:
A获取data~~~~~~~~~~~~~~~~~~~~~~~~~~B获取data
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
A对data操作后,事务加悲观锁保存它~~~~~~B被系统sleep
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
A结束~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~B被系统继续sleep
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~B对data操作后,事务加悲观锁保存它,A的修改被覆盖

巴扎黑
巴扎黑

全部回复(1)
迷茫

事物加悲观锁,即

start transaction
select ... for update // 锁数据
...
update ... // 更新锁住数据的状态
commit

上面是mysql本身的机制,另外也可以采用自己实现的乐观锁,即
数据库增加一个version字段

select ...,verison as last_version form table where condition
...
update table set ...,version=version+1 where condition and version = last_version

至于选择可以参看数据库并发控制 你选乐观锁还是悲观锁?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号