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

外部有事务就加入,没有事务就以非事务的方式运行。

事物失效的场景​

  1. 数据库引擎不支持,mysql的myisam的执行引擎不支持事物。

  2. 没有被spring管理。

  3. 方法不是public的。

  4. 数据源没有配置事物管理器。

@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}
  1. 事物的传播行为设置为了不使用事物。

  2. 自身调用问题。

同一个方法中调用,无法走到aop代理。

  1. 异常被吃了。

Last updated

Was this helpful?