1.相关术语
以下都是多线程并发的情况下,A、B事务分属不同线程;
脏读(读取了提交的数据,但是数据回滚了):A事务读取了B事务还没提交的数据,此时A事务读取到的是新的数据,然后B事务回滚了,原数据没有发生变化,此时A事务读取的数据与原数据不一致,这种情况就是脏读;
不可重复读(读取了被提交的数据,指的是更新操作):是指对于同一个数据,由于A事务修改并提交了这个数据,导致B事务在结束之前多次查询该数据得到了不同的结果;
幻读 (读取了提交的数据,指的是增删操作) : 是指在A事务多次读取构成中,B对数据进行了新增或者删除操作,导致A事务多次读取的数据条数不一致;
第一类事务丢失(回滚丢失):是指对于同一份数据,A事务在提交之后,由于B事务做了回滚,导致A事务提交的数据丢失;
第二类事务丢失(提交覆盖丢失):是指A事务与B事务都读取了同一份数据,A事务先提交,B事务后提交,然后B事务把A事务的数据覆盖了;
2.事务的隔离级别
Read uncommitted:允许读取未提交的数据,会产生脏读;
Read committed:只能读取已提交的数据,解决了脏读问题,会产生不可重复读;
Repetable read:允许重复读,事务开启,读取一份数据后,不再允许对这个数据的修改操作,解决了不可重复读问题,会产生幻读;
Serializable:序列化,最高级的事务隔离级别,在该隔离级别下,事务串行化顺序执行(事务组成一串排队执行),可避免脏读、不可重复读与幻读,但是这种事务隔离级别效率低下,比较消耗数据库性能、一般不使用;
oracle与sqlServer默认采用Read committed;
mysql默认采用Repetable read;