转载

【乐观锁和悲观锁】

乐观锁:
总是认为每次读取的是最新的值,但是每次在修改的时候会检查一下版本号,需要在表里面添加一个version字段,每次读取的时候会把version一起读过去,在修改的时候会判断之前读的version版本号是否修改,如果没有修改,就进行跟新操作,如果修改了,就不断retry读取值并尝试修改,直到成功为止。
update table1 set x=x+1, version=version+1 where id=#{id} and version=#{version}

悲观锁:
总是认为每次读取值的时候其他线程在修改,所以在每次操作之前,对数据加读锁,写锁等,可以用数据库提供的行锁,表锁实现。
读锁
mysql> lock table table1 read;
Query OK, 0 rows affected(0.00 sec)

mysql> insert into table1……
ERROR 1099(HY000): Table 'table1' was locked with a READ lock and can't be updated

mysql> unlock tables;
mysql> insert into table1……
Query OK, 1 rows affected, 1 warning(0.00 sec)
正文到此结束