一、Spring的事务特性

原子性 (atomicity):强调事务的不可分割.
一致性 (consistency):事务的执行的前后数据的完整性保持一致.
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
持久性(durability) :事务一旦结束,数据就持久到数据库

二、事务的隔离级别

事务的隔离要解决的问题有3个:

1,脏读,即一个事务读到另一个事务还没有提交的数据。如果另一个事务失败了,回滚了,那么第一个事务读到的数据就是无效的数据。这就是脏读。
2,不可重复读,不可重复读发生在一个事务里两次查询同一个数据,发现查询结果不一样。这是因为在该事务的两次查询之间,有另一个事务更新了该数据。
3,幻读,幻读和不可重复读比较类似。当一个事务t1,第一次查询了一些行,第二次又查询了一些行,发现两次查询出来的行个数不一样,或者多了一些行,或者少了一些行,好像出现了幻觉一样。这是因为在两次查询之间,有另一事务更新了符合第一个事务查询条件的行。

级别如下:

DEFAULT :这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

READ UNCOMMITTED(读未提交数据):允许事务读取未被其他事务提交的数据,会出现脏读、不可重复读和幻读问题。

READ COMMITTED(读已提交数据):只允许事务读取已经被其他事务提交的变更数据,可避免脏读,仍会出现不可重复读和幻读问题。

REPEATABLE READ(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。

SERIALIZABLE(序列化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,即事务被处理为顺序执行。可避免所有并发问题,但性能非常低。

三、Spring的7中传播行为

REQUIRED:业务方法需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就加入该事务,否则自己创建一个新的事务.这是spring默认的传播行为.

SUPPORTS:如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分,如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行.

MANDATORY:只能在一个已存在事务中执行,业务方法不能发起自己的事务,如果业务方法在没有事务的环境下调用,就抛异常

REQUIRES_NEW:业务方法总是会为自己发起一个新的事务,如果方法已运行在一个事务中,则原有事务被挂起,新的事务被创建,直到方法结束,新事务才结束,原先的事务才会恢复执行.

NOT_SUPPORTED:声明方法需要事务,如果方法没有关联到一个事务,容器不会为它开启事务.如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行.

NEVER:声明方法绝对不能在事务范围内执行,如果方法在某个事务范围内执行,容器就抛异常.只有没关联到事务,才正常执行.

NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中.如果没有活动的事务,则按REQUIRED属性执行.它使用了一个单独的事务, 这个事务拥有多个可以回滚的保证点.内部事务回滚不会对外部事务造成影响, 它只对DataSourceTransactionManager 事务管理器起效.