脏读:读到其他事务未提交的数据
不可重复读:当前事务中第一次读个第二次读到的数据不一致。
幻读:和不可重复读一样,区别是读到新增的数据,而不可重复读是读到被修改的数据。
悲观锁:总是认为数据会有其他线程修改
读锁:加读锁,其他线程可以读,不可以写
写锁:其他线程不可读不可写
乐观锁:总是认为数据不会被更改,只有在更改数据的时候才去比较一下数据是否被更改过。
读未提交:啥问题都有
读已提交:有不可重复读和幻读的问题
可重复读:有幻读问题
串行化:啥问题没有
可重复读和读已提交都是基于MVCC原理实现的:
mysql的每次开启事务都会分配一个递增的事务id,每条数据都有一条隐藏的创建事务id和删除事务id,begin的时候为分配一个事务id,执行select的时候会记录当前最大的已提交事务id,然后在查询语句后添加过滤条件创建事务id<当前最大的已提交事务id and 删除id > 当前最大的已提交事务id
update会新增一条相同的记录,创建版本号不同,多条符合条件的取版本最高的。
同一个事务中update之后再select会更新记录的快照点。