一、Mysql进行事务并发控制时经常遇到的问题
脏读:在事务进行中,读到了其他事务未提交的数据。
举个例子:
有一个table表,如果执行顺序如下
这种情况下左边查询的结果会是101,正是因为读取到了另一个事务未提交的数据。
幻读:在一个事务中,用同样的操作查询数据,得到的记录数不相同。
举个例子:
可能会有这样一个问题:第一次查询数量为0在业务中是满足某一个if的条件进行相关的业务处理,后续再查的时候发现数量不为0了,业务处理判断错误了,在方法中return了,这样就出问题了
不可重复读:在一个事务中,多次查询的结果不一致
举个例子:
第一次查询row为0的情况下,第二次查询row结果为100。每次查结果不一致的情况下,业务是没法进行下去的。这个问题跟幻读很像
二、如何处理这些问题
处理这些问题有很多的解决方法:加锁、事务隔离、MVCC等
加锁:
1.脏读:加排他锁,直到事务提交才释放。读取时候加共享锁,读完释放锁。
2.幻读:加范围缩。.
3.不可重复读:读数据时加共享锁,写数据时加排他锁。
*存在的问题:加锁必然会影响性能,如果有很多事务进行并发的时候,加锁也不是一个很好的解决策略。