Spring 事务
简介
spring基于jdbc和threadLocal等封装的一套事务管理机制.主要功能有:1.资源管理,无需手动连接资源,释放资源,共享资源.2.嵌套事务,不同的事务使用不同的策略.
主要组成
TransactionManager
事务资源管理器,提供获取事务,提交事务,回滚事务功能.
spring 不会直接管理事物,而是提供了事物管理器.交给持久化框架,mybatis,Hibernate,jpa来执行.
TransactionDefinition
定义事物.(事物隔离级别,传播行为,超时,只读,回滚规则).
TransactionStatus
事务的状态.
记录着事物的状态,主要有:是否新建的事物,设置回滚,是否回滚,是否有恢复点,是否已完成.
TransactionSynchronizationManager
事务资源同步管理器.内部用ThreadLocal存储事务资源.
传播机制
/** 外层 **/
@Transactional(rollbackFor=tion.class})
public void insertUser(User user, int flag) {
userMapper.insert(user);
orgService.insertOrg(new Org(UUID.randomUUID().toString(),
"组织", "xx"), flag);
}
/** 内层**/
@Transactional(propagation = Propagation.REQUIRED)
public void insertOrg(Org org, int flag) {
orgMapper.insert(org);
if (flag == 0)
throw new RuntimeException("异常!!");
}1.REQUIRED
默认的传播机制,存在外部事务则加入,不存在就创建一个新的.异常时和外部一同回滚.
2.REQUIRES_NEW
创建一个新的事务,存在外部事务就挂起外部事务.异常时只回滚当前事务.
3.SUPPORTS
外部有事务就加入,没有事务就以非事务的方式运行。
事物失效的场景
数据库引擎不支持,mysql的myisam的执行引擎不支持事物。
没有被spring管理。
方法不是public的。
数据源没有配置事物管理器。
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}事物的传播行为设置为了不使用事物。
自身调用问题。
同一个方法中调用,无法走到aop代理。
异常被吃了。
Last updated
Was this helpful?