spring事务机制

什么是事务

对数据资源访问的控制,保证系统数据处于正确状态 ,持有四个限定

  • 原子性

    要求事务的全部操作是一个不可分割的整体,要么全部成功,要么全部失败

  • 一致性

    要求事务操作不能违反数据资源的一致性检查。

  • 隔离性

    事务的隔离性规定了个各个事务之间互相影响的程度,面向数字资源的并发访问,并影响事务的一致性。数据库四种隔离级别

    • 读未提交

    • 读已提交

    • 可重复读

    • 序列化

java的事务管理

  • java的局部事务管理

    通过数据访问技术提供的Connection的API管理事务。

  • 数据库资源的局部事务管理

    Java通过JDBC访问关系型数据库,可以通过数据库连接Connection的自动提交(Autocommit)设置为False,改手动提交控制事务的回滚或提交。

    //设置属性是否自动提交,默认为ture
    void setAutoCommit(boolean autoCommit) throws SQLException;
    ​
    //提交事务
    void commit() throws SQLException;
    ​
    //撤销事务
    void rollback() throws SQLException;
    ​
    //设置保存点
    Savepoint setSavepoint() throws SQLException;
    Savepoint setSavepoint(String name) throws SQLException;
    ​
    //保存点回滚
    void rollback(Savepoint savepoint) throws SQLException;
    ​
    //删除指定的保存点及其之后的保存点
    void releaseSavepoint(Savepoint savepoint) throws SQLException;
  • java平台的分布式事务支持

    • JTA分布式事务支持

      JTA是sun公司提供的标准化分布式事务访问的java接口规范,具体实现留给了相应供应商去实现。

Spring事务机制

三个核心接口

  • PlatformTransactionManager 事务抽象策略的顶级接口

    public interface PlatformTransactionManager extends TransactionManager { 
    ​
    //获取事务状态
    TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;
    ​
    //提交事务
    void commit(TransactionStatus status) throws TransactionException; 
    ​
    //回滚事务
    void rollback(TransactionStatus status) throws TransactionException;
    ​
    }

  • TransactionDefinition 接口 定义事务属性,包括事务隔离级别,事务传播行为,事务超时时间,是否为只读事务

  • TransactionStatus 接口 定义事务状态,编程式事务使用此接口 

  • 事务传播行为,表示整个事务处理过程所跨的业务对象将以什么样的行为参与事务;

    • PROPAGATION_REQUIRED 如果当前存在事务的话,则加入当前事务,如果不存在任何事务,则新建一个事务

    • PROPAGATION_SUPPORTS 如果当前存在一个事务,则加入事务,如果当前不存在事务,则直接执行

    • PROPAGATION_MANDATORY 强制要求当前存在一个事务,如不存在抛出异常

    • PROPAGATION_REQUIRES_NEW 不管当前是否存在事务,都会新建事务,如果存在当前事务,将当前事务挂起;适用于该事务的成功与否不影响外部事务;

    • PROPAGATION_NOT_SUPPORTED 不支持当前事务,不论当前是否存在事务,都会以非事务的方式运行。

    • PROPAGATION_NEVERS 永远不需要当前事务,如果存在事务,则抛出异常,

    • PROPAGATION_NESTED 如果当前事务存在,则在嵌套事务中执行,否则,与REQUIRED一样。

TransactionTemplate 模板类

  • 对事物操作及相关异常进行了模板化封装,执行事务的方法为 public <T> T execute(TransactionCallback<T> action) throws TransactionException

  • TransactionCallback 函数式接口实现事务的具体操作。

    @FunctionalInterface
    public interface TransactionCallback<T> {
    ​
        @Nullable
        T doInTransaction(TransactionStatus status);
    ​
    }
    ​

声明式事务和编程式事务

  • 编程式事务

// PlatformTransactionManager 方式
​
public class FooService {
    private PlatformTransactionManager transactionManager;
    public void serviceMethod() {
        TrạnsactionDefinition definition = new DefaultTransactionDefinition();
        TransactionStatus txStatus = getTransactionManager().getTransaction(definition);
        try {
            // dao1.doDataAccess();
            // dao2.doDataAccess();
      // ...
    }
        catch(DataAccessException e) {
      getTransactionManager().rollback(txStatua);
            throw e;
    }
        catch(OtherNecessaryException e) {
            getTransactionManager().rollback(txStatus);
            throw e;
    }
        getTransactionManager().commit(txStatus);
  }
    
    public PlatformTransactionManager getTransactionManager() {
        return transactionManager;
  }
  
    public void setTransactionManager(PlatformTransactionManager transactionManager) {
        this.transactionManager=transactionManager;
  }
}
 
//TransactionTemplate方式
​
@Service
public class UserServiceImpl implements UserService {
​
    @Autowired
    private PlatformTransactionManager txManager;
​
    @Autowired
    private UserDAO userDAO;
​
    @Override
    public void updateUser(User user) throws Exception {
        TransactionTemplate txTemplate = new TransactionTemplate(txManager);
        txTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        txTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                try {
                    // 执行业务逻辑,更新用户信息
                    userDAO.updateUser(user);
                } catch (Exception e) {
                    // 手动抛出异常以回滚事务
                    status.setRollbackOnly();
                    throw new RuntimeException("更新用户信息失败:" + e.getMessage());
                }
            }
        });
    }
}
​
  • 声明式事务

通过@Transactional注解事项,此注解可标注在方法或类上面表示标注的方法或类的所有方法在事务控制下执行。

@Transactional属性介绍

  1. propagation:事务传播行为,默认值为 REQUIRED。共有七种传播行为

  1. isolation:事务隔离级别,默认值为 DEFAULT及数据默认的隔离级别。共有五种隔离级别,

  1. timeout:事务超时时间,默认值为 -1,表示不启用超时。超时时间的单位为秒。

  2. readOnly:是否为只读事务,默认值为 false,表示不是只读事务。如果设置为 true,则该事务中的操作只能读取数据库,不能修改数据库,用于优化性能。

  3. rollbackFor、noRollbackFor:设置需要回滚或不回滚的异常类型。

    • rollbackFor:设置需要回滚的异常类型,可设置多个。

    • noRollbackFor:设置不需要回滚的异常类型,可设置多个。

  4. value、transactionManager:指定事务管理器或事务管理器的 bean 名称。

    • value:指定事务管理器的 bean 名称。

    • transactionManager:指定事务管理器的 bean 名称。

  5. qualifier:指定注入的事务管理器的 bean 名称,当存在多个事务管理器时使用。

  6. name:指定该事务的名称。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值