简介
- spring事务通过这个接口来定义的:TransactionDefinition ,这个接口包含了和事务属性有关的方法和参数定义。
- spring事务里面PlatformTransactionManager这个接口定义了事务的具体执行操作方法。其最终的实现类主要有:DataSourceTransactionManager:适用于使用JDBC和iBatis进行数据持久化操作的情况。
HibernateTransactionManager:适用于使用Hibernate进行数据持久化操作的情况。
JpaTransactionManager:适用于使用JPA进行数据持久化操作的情况。这个类也可以管理jdbc的事务。ps:(This transaction manager also supports direct DataSource access within a- transaction (i.e. plain JDBC code working with the same DataSource).)
事务隔离级别
在这个接口里面定义了一些事务隔离级别,这和mysql的事务隔离界别没区别,都是RU,RC,RR,SE。我们可以使用符合自己业务需求的隔离级别。
事务传播级别
在接口定义中,下面几个参数代表了不同传播级别。事务的传播就是在开启当前事务之前已经开启了一个事务。
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
- PROPAGATION_REQUIRED:若存在事务,则加入当前事务,否则创建一个新事务。
- PROPAGATION_SUPPORTS:若存在事务,则加入当前事务,否则以无事务的状态运行。
- PROPAGATION_MANDATORY:如果存在事务则加入当前事务,没有则抛出异常。
- PROPAGATION_REQUIRES_NEW:创建一个新事务,以这个新事务为主,把已存在的事务挂起。
- PROPAGATION_NOT_SUPPORTED:以非事务的方式运行,若存在事务,则把当前事务挂起。
- PROPAGATION_NEVER:以非事务的方向运行,若存在事务,则抛出异常。
- PROPAGATION_NESTED:若存在事务,则创建一个事务作为当前事务的嵌套事务来执行,没有则是创建一个新事物和PROPAGATION_REQUIRED类似。内嵌事务并不是一个独立的事务,它依赖于外部事务的存在,只有通过外部的事务提交,才能引起内部事务的提交,嵌套的子事务不能单独提交。
编程式事务
类似于JDBC编程实现事务管理。Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是采用相同的API进行编程。
声明式事务
声明式事务实际上是通过aop实现的,我们一般也是采用这个方案,可以有效的减少代码code。并且把公共代码全部抽取了出来。我们一般也是采用这个方案。