mysql锁
丢失更新,脏读,不可重复读,幻读;
丢失更新是指:事务A和事务B中,假设事务A做了一个更新,并提交了,但是事务B并没有察觉到事务A所做的事情,所以事务B还是照常执行,于是乎,事务B丢失了更新;
![](https://images2018.cnblogs.com/blog/1322092/201804/1322092-20180418131142124-1810570238.jpg)
如何避免这个问题呢?
我们可以通过乐观锁来解决这个问题,事务A在进行更新操作之前,可以先进行查询判断,select table set amout = 1100 where id = xxx and amount = 1000;加上一个金额的判断,如果更改之前数据没有修改则执行成功;否则执行失败回滚;
在这里我们顺便说说乐观锁和悲观锁的概念和区别;
悲观锁:顾名思义,就是很悲观,每次去拿数据都认为数据已经被修改了,所以每次都会上锁,悲观锁一般用于冲突率比较高的时候,
乐观锁:就是 很乐观,认为别人是不会修改的,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,如果更新了,就回滚数据,乐观锁用户写比较少,读比较多的情况,这样冲图很少发生,减少上锁的开销;而悲观锁用在冲突率比较高的情况下,保证了数据库的安全,如果加了乐观锁,不断地回滚,反而降低了性能;
我们在使用乐观锁的时候,会使用版本锁定,带上更新钱的状态等方式来实现;
额。。。好了我们继续讲这个读的问题。。。刚才跑题了都。。。。
脏读:
脏读跟前面的相反,就是在事务A和事务B之间,事务A执行了操作,而事务B查询到了你这种操作,但是,这个时候,事务A又回滚了,这个蛋疼的操作,于是,真正的数据其实是没变的,而事务B查询到的其实是脏的数据;
![](https://images2018.cnblogs.com/blog/1322092/201804/1322092-20180418131302317-1063678531.jpg)
幻读:出现了幻觉;就是事务A查询到没有数据,而这个时候事务B更新了数据,而当事务A插入数据的时候就发现,冲突了,这个时候就是说,明明我事务A查询到没有数据,插入数据的时候却发现数据冲突,就像出现了幻觉一样;这就是幻读;