事务在企业日常开发中几乎是一定会遇到的, 一般就是开启事务支持, 然后 @Transactional, 但是事务不仅仅是这些, 可以了解一下细节
事务:
说白了就是一系列操作要么成功, 要么失败, 最典型的场景就是转账
事务四大特性: ACID
1, 原子性 (Atomicity):
事务是一个原子操作, 由一系列动作组成. 事务的原子性确保动作要么全部完成, 要么完全失败
2, 一致性 (Consistency):
一旦事务完成 (不管成功还是失败), 系统必须确保它处于一致的状态, 而不会是部分完成部分失败. 在现实中的数据不应该被破坏
3, 隔离性 (Isolation):
多个事务会同时处理相同的数据, 因此每个事务都应该与其他事务隔离开来, 防止数据损坏
4, 持久性 (Durability):
一旦事务完成, 无论发生什么系统错误, 它的结果都不应该受到影响, 这样就能从任何系统崩溃中恢复过来. 通常情况下, 事务的结果被写
到持久化存储器中
事务三大要素
1,DataSource: 事务的真正处理者, 如 MySQL 等
2,TransactionManager: 管理事务的处理过程, 如打开, 提交, 回滚
3, 事务应用和属性配置: 作为一个标识符表明哪些方法要参与事务, 一些配置: 隔离级别, 超时时间等
核心接口
Spring 事务设计的接口如下:
事务管理器
Spring 并不直接管理事务, 而是提供了多种事务管理器, 他们将事务管理的职责委托给 Hibernate 或者 JTA 等持久化机制所提供的相关平台框架
的事务来实现
PlatformTransactionManager:
Spring 事务管理器的接口, 通过这个接口, JDBC,Hibernate 等提供了对应的任务管理器, 进行具体的实现
具体代码:
- public interface PlatformTransactionManager {
- // 由 TransactionDefinition 得到 TransactionStatus 对象
- TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
- // 提交事务
- void commit(TransactionStatus status) throws TransactionException;
- // 回滚事务
- void rollback(TransactionStatus status) throws TransactionException;
- }
1,jdbc 事务
如果应用程序中直接使用 JDBC 来进行持久化, DataSourceTransactionManager 会为你处理事务边界. 为了使用 DataSourceTransactionManager
, 你需要使用如下的 xml 将其装配到应用程序的上下文定义中:
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
实际上, DataSourceTransactionManager 是通过调用 java.sql.Connection 来管理事务, 而后者是通过 DataSource 获取到的. 通过调用连接的
commit() 方法来提交事务, 同样, 事务失败则通过调用 rollback() 方法进行回滚.
2,Hibernate 事务
如果应用程序的持久化是通过 Hibernate 实习的, 那么你需要使用 HibernateTransactionManager. 对于 Hibernate3, 需要在 Spring 上下文定义
中添加如下的 < bean > 声明:
- <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
sessionFactory 属性需要装配一个 Hibernate 的 session 工厂, HibernateTransactionManager 的实现细节是它将事务管理的职责委托给
org.hibernate.Transaction 对象, 而后者是从 Hibernate Session 中获取到的. 当事务成功完成时, HibernateTransactionManager 将会调用
Transaction 对象的 commit() 方法, 反之, 将会调用 rollback() 方法.
3,Java 持久化 API 事务 (JPA)
Hibernate 多年来一直是事实上的 Java 持久化标准, 但是现在 Java 持久化 API 作为真正的 Java 持久化标准进入大家的视野. 如果你计划使用 JPA
的话, 那你需要使用 Spring 的 JpaTransactionManager 来处理事务. 你需要在 Spring 中这样配置 JpaTransactionManager:
- <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
- <property name="sessionFactory" ref="sessionFactory" />
- </bean>
JpaTransactionManager 只需要装配一个 JPA 实体管理工厂 (javax.persistence.EntityManagerFactory 接口的任意实现).
JpaTransactionManager 将与由工厂所产生的 JPA EntityManager 合作来构建事务.
4,Java 原生 API 事务
如果你没有使用以上所述的事务管理, 或者是跨越了多个事务管理源 (比如两个或者是多个不同的数据源), 你就需要使用
- JtaTransactionManager:
- <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
- <property name="transactionManagerName" value="java:/TransactionManager" />
- </bean>
JtaTransactionManager 将事务管理的责任委托给 javax.transaction.UserTransaction 和 javax.transaction.TransactionManager 对象, 其中
事务成功完成通过 UserTransaction.commit() 方法提交, 事务失败通过 UserTransaction.rollback() 方法回滚.
基本事务属性的定义
上面讲到的事务管理器接口 PlatformTransactionManager 通过 getTransaction(TransactionDefinition definition) 方法来得到事务, 这个
方法里面的参数是 TransactionDefinition 类, 这个类就定义了一些基本的事务属性.
事务属性可以理解成事务的一些基本配置, 描述了事务策略如何应用到方法上. 事务属性包含了 5 个方面, 如图所示:
TransactionDefinition 代码
- public interface TransactionDefinition {
- int getPropagationBehavior(); // 返回事务的传播行为
- int getIsolationLevel(); // 返回事务的隔离级别, 事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据
- int getTimeout(); // 返回事务必须在多少秒内完成
- boolean isReadOnly(); // 事务是否只读, 事务管理器能够根据这个返回值进行优化, 确保事务是只读的
- }
Spring 定义了七种传播行为:
具体内容可参考: https://www.open-open.com/lib/view/open1350865116821.html
隔离级别
定义了一个事务可能受其他并发事务影响的程度
来源: http://www.bubuko.com/infodetail-3084110.html