为了解决丢失更新的问题。
丢失更新:两个事务同时修改同一条记录,事务A的修改被事务B覆盖了。
举个例子:X=5,A和B同时把X读出来,减1,再写回去,得到X=4,实际X=3;
解决方法:
1、利用单条语句的原子性
update T set balance= balance - 50 where id = 1;
2、悲观锁
int b = select balance from T where id =1 for update;
b=b+50;
update T set balance =b where id =1;
3、乐观锁
while(!result){
start transaction
int b,v1=select balance,version from T where id =1;
b=b+50;
//CAS
result = update T set balance = b,version = version + 1 where id = 1 and version =v1;
}