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 | <tx:advice id="crudAdvice" transaction-manager="txManager"> |