一、解释
1.脏读:当一个事务读取某个数据,并对它进行了修改,但是未提交到数据库;这时,另一个事务也访问到了这个数据,并进行了进一步的处理,就产生了未提交的数据依赖的关系。脏数据就是指修改了但未提交,处于待定状态的数据(可能提交也可能回滚)。
2.不可重复读:一个事务多次读取一条数据,在两次读取同一数据的中间,有另一个事务读取这个数据并进行了修改,则会导致该事务两次读取到的数据内容不一致。这就称为不可重复读。
3.幻读:是指当事务非独立执行时发生的一种现象。当一个事务对一个表中的所有行的某项数据进行了修改,例如从“a”修改为“b”;而这时另一个事务对这个表进行了插入操作,依然以“a”的值作为提交的数据。当事务1重新查询的时候,会发现又出现了修改前的数据,以为是未修改,像出现了幻觉一样,这就是幻读,也叫虚读。
二、五种事务隔离级别
Spring在TransactionDefinition接口中定义了一下五个不同的事务隔离级别:
1.ISOLATION_DEFAULT:这是一个PlatformTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。
2.ISOLATION_READ_UNCOMMITTED: 这是事务最低的一个隔离级别。它表示允许事务2访问到事务1未提交的数据,所以,这种隔离级别会产生脏读、幻读、不可重复读。
3.ISOLATION_READ_COMMITTED: 保证了事务1修改后的数据提交后才能被事务2读取,未提交的数据不能被其他事务读取。这就避免了脏读,但不可避免幻读和不可重复读。
4.ISOLATION_REPEATABLE_READ: 既保证了一个事务未提交的已修改数据不能被其他事务读取,也保证了不会发生不可重复读,但不能避免幻读。
5.ISOLATION_SERIALIZABLE: 花费代价最高但是最可靠的一种事务隔离级别。事务被处理为顺序执行,避免了幻读、不可重复读。脏读。
三、七种事务传播机制
在声明式的事务处理中,要配置一个切面, 其中就用到了propagation,表示打算对这些方法怎么使用事务:
1.PROPAGATION_REQUIRED: 如果当前存在一个事务,则支持当前事务。如果没有事务,则开启一个新事务。
2.PROPAGATION_SUPPORTS: 如果存在事务,则支持当前事务。如果没有,以非事务方式执行。
3.PROPAGATION_MANDOTARY: 如果存在事务,则支持当前事务;如果没有一个活动的事务,则抛出异常。
4.PROPAGATION_REQUIRES_NEW: 总是开启一个新事务;如果当前存在事务,就把当期事务挂起。
5.PROPAGATION_NOT_SUPPORTED: 总是非事务的执行,并挂起任何存在的事务。
6.PROPAGATION_NEVER: 总是以非事务方式执行,如果存在一个活动的事务,就抛出异常。
7.PROPAGATION_NESTED: 如果当前事务存在,支持当前事务,并运行在一个嵌套的事务中;如果没有活动的事务,就新建一个事务。