一、事务的隔离级别
1.五种事务的隔离级别
①读_未提交(read_uncommitted): 会出现脏读、不可重复读、幻读。(隔离级别最低,并发性能高)
②读_已提交(read_committed):会出现不可重复读、幻读。(锁定正在读取的行)
③重复读(repeatable_read):会出现幻读。(锁定所读取的所有行)
④序列化(serializable):保证所有的情况不会发生;(锁表)
⑤默认的隔离级别:
大多数的默认隔离级别是:读已提交(read_commited)如:Sql Server Oracle.
少数的数据库的默认隔离级别为:可重复读(Repeatable Read)如:MySQL InnoDB存储引擎;
注意:即使是最低的隔离级别,也不会出现第一类丢失更新的问题;
2.不同的事务隔离级别带来的问题的详解
①脏读(事务没有提交,提前读取),像是对表进行了更改操作,但是还没commit;其他事务就来读取使用了所修改的对象了;
②不可重复读(两次读的不一致),是指当一个事务在两次读一个数据的中间,读完第一次后其他的事务对该数据进行了修改,造成第一个事务两次读取的结果不一样;
③幻读(是在一个事务对整个表进行修改的时候,另一个事务对该表进行了修改,第一个事务再次读该表的时候的发现竟然还有没有被修改的数据)主要是有事务进行了突然的新增或者删除,造成两次读出来的数据的记录数不一样了;
注意:不可重复读和幻读的区别是,不可重复读指的是有其他事务对数据进行了修改,造成两次读的值不一样;而幻读指的是其他事务对所读的数据的个数进行了修改也就是发生的插入和删除,这样在数据记录的个数上发生了改变;
二、事务的传播行为
1.Spring中定义的7种事务传播行为
①PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中;
②PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行;
③PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常;
④PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起;
⑤PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起;
⑥PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常;
⑦PEOPAGATION_NESTED
如果当前存在事务,则在潜逃事务内执行。如果当前没有事务,则执行PROPAGATION_REQUIRED列斯的操作;