Mysql 先SELECT 后UPDATE 问题

最近作一个统计;须要把一个字段(存放数据是json)里某一个数字加1 而后在修改该字段;当时就那么一写最后发现该数据和明细对不上; 其实这个应该是并发引发的,先select 在update 这样写其实会出现一些问题html

参考篇文章mysql

###第一种解决方案sql

事务,即用一个事务来包裹上面的SELECT+UPDATE操做+写共享锁。json

读共享锁是经过下面这样的SQL得到的:SELECT * FROM parent WHERE NAME = 'Jones' LOCK IN SHARE MODE;并发

若是事务A得到了先得到了读共享锁,那么事务B以后仍然能够读取加了读共享锁的行数据,但必须等事务A commit或者roll back以后才能够更新或者删除加了读共享锁的行数据。学习

若是事务A先得到了某行的写共享锁,那么事务B就必须等待事务A commit或者roll back以后才能够访问行数据。.net

SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;

###第二种解决方案code

乐观锁,上面是一种观锁机制,并且SELECT...FOR UPDATE方式也不太经常使用htm

SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1 WHERE counter_field='上面select出来的值' ;

这样能够根据UPDATE返回值来判断是否更新成功,若是返回值是0则代表存在并发更新,那么只须要重试一下就行了。blog

  1. 若是对读的响应度要求很是高,好比证券交易系统,那么适合用乐观锁,由于悲观锁会阻塞读

  2. 若是读远多于写,那么也适合用乐观锁,由于用悲观锁会致使大量读被少许的写阻塞

  3. 若是写操做频繁而且冲突比例很高,那么适合用悲观写独占锁

mysql锁相关学习

相关文章
相关标签/搜索