事务的几个接口
PlatformTransactionManager
这里面有commit方法和rollback方法,谁有这两个方法,谁就是通知bean
- 我们在开发中都是使用其实现类:
- DataSourceTransactionManager
使用spring JDBC或mybatis持久化数据的时候使用
- HibernateTransactionManager
使用Hibernate版本进行持久化数据时使用
TransactionDefinition
它是事务的定义信息对象。里面有方法如下:
-
获取事务的名称
- String getName()
- String getName()
-
获取事务的隔离级别
- int getIsolationLevel()
事务的隔离级别默认有四个,spring默认情况下 是使用数据库的默认隔离级别
ISOLATION_DEFAULT:默认级别数据库使用哪种隔离级别,spring就是哪种隔离级别
-
获取事务的传播行为
- int getPropagationBehavior()
什么情况下必须有事务,什么情况可有可没有?
增删改必须有事务;查询的时候,事务是可有可没有的。
REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务,加入到这个事务中。一般的选择(默认值,增删改操作的时候,不管原来有没有事务,最终肯定会有事务的。)
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务,执行查询操作的时候,如果当前有事务就用,没有事务就拉倒。)
-
获取事务超时时间
- int getTimeOut()
是指提交和回滚多长时间就过期了,-1就是永远不过期
-
获取事务是否只读
- boolean isReadOnly()
- 读写型事务:增加、删除、修改开启事务
- 只读型事务:执行查询时,也会开启事务
- boolean isReadOnly()
在我们配置事务管理器的同时,我们还需要指定事务相关的属性。就是在TransactionDefinition里面的几个方法。还有就是要对谁进行控制,就是切入点表达式
是使用xml配置事务 还是使用注解配置事务? 我毫无疑问的会选择xml,因为xml只要配置一次 就可以一劳永逸的解决所有service的事务问题,而注解 有可能在一个service中都需要配置好几遍。 就是因为事务的不同类型,读写型还是只读型,从配置简易程度来说 还是注解的配置更简单。