spring事务管理

Spring 事务管理

事务的操作:
1.原子性(Atomicity):事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做.

2.一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据依然处于正确的状态,即数据完整性约束没有被破坏,如 A 给 B 转账,不论转账成功与否转账之后 的 A 和 B 的账户总额和转账之前是相同的.

3.隔离性(Isolation):当多个事务处于并发访问同一个数据库资源时,事务之间相互影响程度,不同的隔离级别决定了各个事务对数据资源访问的不同行为.

4.持久性(Durability):事务一旦执行成功它,对数据库的数据的改变是不可逆的.

Spring 的事务管理主要包括 3 个接口:

1.PlatformTransactionManager:根据 TransactionDefinition 提供的事务属性配置信息,创建事务.

2.ransactionDefinition:封装事务的隔离级别和超时时间,是否为只读事务和事务的隔离级别和传播
规则等事务属性.

3.TransactionStatus:封装了事务的具体运行状态.如是否是新开启事务,是否已经提交事务,设置当
前事务为 rollback-only 等.

PlatformTransactionManager:
1:TransactionStatus getTransaction(TransactionDefinition definition):
根据事务定义信息从事务环境中返回一个已存在的事务,或者创建一个新的事务.
2:void commit(TransactionStatus status):
根据事务的状态提交事务,如果事务状态已经标识为rollback-only,该方法执行回滚事务的操作.
3:void rollback(TransactionStatus status):
将事务回滚,当 commit 方法抛出异常时,rollback 会被隐式调用

TransactionDefinition:
封装事务的隔离级别和超时时间,是否为只读事务和事务的隔离级别和传播规则等事务属性

TransactionStatus:
封装了事务的具体运行状态.如是否是新开启事务,是否已经提交事务,设置当前事务为 rollback-only 等.

事务的传播规则

spring支持7种传播行为

情况一:遵从当前事务
REQUIRED: 必须存在事务,如果当前存在一个事务,则加入该事务,如果当前没有事务,将新
建一个事务
SUPPORTS: 支持当前事务,指如果当前存在事务,就加入到该事务,如果当前没有事务,就以
非事务方式执行
MANDATORY: 使用当前事务执行,如果当前没有事务,则抛出异常
IllegalTransactionStateException

情况二:不遵从当前事务
REQUIRES_NEW: 不管当前是否存在事务,每次都创建新的事务
NOT_SUPPORTRD: 以非事务方式执行,如果当前存在事务,就把当前事务暂停,以非事务方
式执行
NEVER: 不支持事务,如果当前存在是事务,则抛出异常,IllegalTransactionStateException

情况三:寄生事务(外部事务和寄生事务)
NESTED :寄生事务,如果当前存在事务,则在内部事务内执行.如果当前不存在事务,则创建
一个新的事务(和 REQUIRED 相同).
嵌套事务使用数据库中的保存点(savepoint)来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚将导致嵌套事务回滚.DataSourceTransactionManager 默认支持,而 HibernateTransactionManager 默认不支持, 需要手动开启.

事务方法属性配置

CRUD 通用事务配置
1
2
3
4
5
6
7
<tx:advice id="crudAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- service 中查询方法 -->
<tx:method name="get*" read-only="true"/> <tx:method name="list*" read-only="true"/> <tx:method name="query*" read-only="true"/> <!-- service 中其他方法 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>