对于事务,这是数据库一种重要的资源,对于这种资源的开销是很大的。spring支持了aop(面向切面编程),所以事务是和核心的代码无关的事情,所以可以使用aop来解决事务。这我们就不讲了,我们用标签来讲。
- @transactional是事务的标签,标识在一个类上,说明该类的所有的方法都使用事务。标识在方法上,标识该方法是开启事务。建议是使用在方法上。
- @transactional只有标识在public方法上才有效。对于事务方法,一般都是其他的方法来调用,这就要求必须可以在包外调用。如果是protected,private,默认都不会生效。
- 同一个类调用事务方法会失效,比如Test类,a方法没开启事务,b方法开启了事务,a内调用了b方法,调用a方法,b方法的事务是不会生效的。
Transactional标签的属性,propagation,only-read, isolation
Propagation是执行方法与事务之间的关系。有7种关系。
- REQUIRE(默认):必须有事务,如果当前有事务,则在该事务环境下执行,如果没开启事务,就会创建一个新的事务,在该事务环境下执行。
- RRQURIEDNEW:不管有没有事务,都会开启一个事务,并在新的事务下执行。
- SUPPOR:支持事务,如果有事务,就在该事务环境下执行,没有事务,就不会在事务环境下执行。
- NOTSUPPORT:不支持事务,如果在事务环境下,就把挂起该事务,如果没开启事务,就正常执行。
- NEVER:如果有事务,就会异常,如果没有事务,正常执行。
- MANDATORY:必须嵌套在一个事务,如果有事务,则嵌套事务,如果没有事务,就会报出异常
- NEWTED:如果有事务就嵌套在一个事务里,如果没有事务按照REQIRE来执行。
only-read:表示该方法对数据库只有读事件。
isolation:表示该方法采用哪种隔离级别。ISOLATION_DEFAULT(采用数据库默认的事务隔离级别),ISOLATION_READ_UNCOMMITTED(读未提交),ISOLATION_READ_COMMIT(读已提交),ISOLATION_REPEATABLE_READ(可重复读),ISOLATION_SERIALIEABLE(序列化)。
timeout:时间限制。还要一个回滚的,基本spring对于事务的支持就这些。