@Transactional注解
对于声明式事务使用此注解进行标注的,这个注解可以标注在类上和方法上,标注在类上时,表示所有公共非静态类都开启事务功能。
该注解上还可以配置十种属性,但是常用的5种分别是:
1.value:定义事务管理器,他是ioc容器里的一个bean id,这个bean需要实现接口Platform TransactionManager。
2.isolation:隔离级别,这是数据库同时存在多个事务时才有意义的概念
3.propagation:传播行为,传播行为是方法之间调用的问题。
4.timeout:超时时间,单位为秒,超时会导致异常,默认导致事务回滚。
5.readonly:是否开启只读。默认为false。
在Spring ioc容器初始化时,spring会读入这个注解中配置的信息,然后把信息存储到事务定义器(TransactionDefinition接口的实现类)里面。在spring上下文调用被修饰的方法时,spring就会产生aop功能,首先通过事务管理器创建事务,根据Spring提供的事务管理器顶层接口PlatformTransactionManager的源码来看,它的getTransaction方法传入的一个TransactionDefinition类型的参数,这就表明前面我们存储到事务定义器中的属性就会被被设置在事务上。创建事务完毕后 通过反射调用开发者的业务逻辑代码,如果没有异常,事务管理器就会为我们提交事务,否则就会回滚。所以我们在开发过程中只需要写业务代码和注解相关配置就可以了。
在springboot中,当你依赖了mybatis-spring-boot-starter后,他会自动创建一个DataSourceTransactionManager对象作为事务管理器。