见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的修改被覆盖
回复内容: 见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的修改被覆盖
事物加悲观锁,即
start transactionselect ... 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
至于选择可以参看数据库并发控制 你选乐观锁还是悲观锁?