在看springboot 实战这本书的时候看到了spring 事物注解。为此记录一下。
Spring支持声明式事务,既使用注解来选择需要使用事务的方法,他使用@Transactional注解在方法上声明该方法需要事务支持,这是一个基于AOP的实现操作。备注解的方法在被调用时,SPring开启一个新的事务,当方法完无运行异常结束后,Spring会提交这个事务。
@EnableTracsactionManagement开始声明式事务的支持,使用该注解后,Spring容器会自动扫描注解@TransactionalManager的类和方法
有关@Transacational的属性
propagationtion:定义了事务的生命周期,默认为REQUIRED
required:方法A调用调用时,没有事务新建一个事务,当在方法A调用另外一个方法B的时候,方法B将使用相同的事务,;如果方法B发生异常需要数据回滚的时候,整个事务数据回滚。
requried_new:对于方法A和方法B在被调用的时候,无论是否有事务,都将开启一个新的事务,如果方法A有异常,方法B的数据不会回滚。
supports:方法调用的时候,有事务就调用事务,没有事物就不使用事物。
no_supports:强制方法不在事务中执行,如有事务,在方法调用的到结束阶段事务将被挂起。
never:强制方法不在事务中执行,如有事务则抛出事务、
mandatory:强制方法在事务中执行,若无事务将抛出异常。
isolation:isolation的默认级别 default
isolation:隔离 决定了事物的完整性,处理在多事务对相同的数据下的处理机制,主要包含下面的隔离级别
read_uncommitted:对于在A事务里修改了一条记录但没有提交事务,在B事务中可以读取到修改后的记录,可导致赃读。
不可重复读和幻读。
read_committed:只有当事务A修改了一条记录提交之后,B事务才可以读取到提交后的记录,阻止了赃读,但是不可重复读,和幻读避免不了。
repeatable_read:A在读取一条记录 B不允许修改
isolation:
serializable:此级别下事务是顺序执行的,可避免上述级别的缺陷,但开销较大。
default:使用当前数据库的默认隔离界别:
oracle、sql Server是read_committied Mysql是repeartable_read;
timeout:事务过期时间
readonly:指明当前事务是否是只读。
rollbackFor:指定哪个或者那些异常可以引起事务回滚。Throwable的子类
noRollBackFor:指定哪个或那些异常不可以引起回滚。Throwable的子类。
当@Tracsactional被注解到来中,所有的public的方法上将开启事务注解。如果类和方法上都是用@Tracsactional注解
方法上的注解将会覆盖类级别上的注解。