spring事物是什么时候提交的

worktile 其他 66

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring事务是在方法执行完毕后自动提交的。

    Spring事务的提交时机取决于事务管理器的配置以及事务的传播属性。当一个方法被标注为事务方法时,Spring会根据配置的事务管理器以及方法的传播属性来决定事务的提交时机。

    在默认情况下,Spring事务管理器是按照方法执行完毕后来提交事务的。当方法执行完毕后,如果没有抛出异常,则事务会被提交。如果方法抛出了异常,并且异常没有被捕获或被处理,那么事务将会回滚。

    除了默认的事务提交时机外,还可以通过配置事务的传播属性来改变事务的提交时机。事务的传播属性可以有以下几种设置:

    • REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。事务将在方法执行完毕后提交或回滚。

    • REQUIRES_NEW:每次都创建一个新的事务,如果当前存在事务,则挂起当前事务后创建新的事务。事务将在方法执行完毕后提交或回滚。

    • NESTED:如果当前存在事务,则以嵌套的方式执行事务,并在方法执行完毕后提交或回滚。如果当前没有事务,则新建一个事务。

    • SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。

    • NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则挂起当前事务。

    • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

    • MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

    总之,Spring事务的提交时机是在方法执行完毕后自动进行的,但可以通过配置事务的传播属性来改变提交时机。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring事务是在方法执行结束后,或者在方法中抛出异常时进行提交的。

    具体来说,Spring事务管理器使用了AOP(面向切面编程)的原理,通过拦截方法调用,在方法执行前后进行事务管理。

    下面是Spring事务的提交时机:

    1. 完成方法执行:事务会在方法体内所有的代码执行完毕后进行提交。这意味着事务会在方法返回之前进行提交。如果方法没有抛出异常,事务将被提交,数据变更将被持久化到数据库中。

    2. 抛出异常:如果方法抛出异常,Spring事务管理器会捕获到异常并回滚事务。回滚事务将撤销之前所做的所有数据库操作。

    一个事务性方法的执行过程如下:

    • 事务开始
    • 执行方法体内的代码
    • 没有异常抛出,事务提交
    • 方法返回
    • 事务结束

    而如果方法抛出了异常:

    • 事务开始
    • 执行方法体内的代码
    • 方法抛出异常,事务回滚
    • 事务结束

    需要注意的是,Spring事务的提交时机也取决于事务的传播行为。传播行为定义了事务方法如何与已经存在的事务进行交互。当事务方法被调用时,根据传播行为的设置,Spring事务管理器会决定是否需要创建一个新的事务或者使用已经存在的事务。

    总结起来,Spring事务是在方法执行结束后提交的,如果方法抛出异常,则事务会被回滚。事务的提交时机也可以根据传播行为的设置进行调整。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring事务的提交时机取决于事务的管理方式和提交策略。

    在Spring中,事务的管理方式有两种:编程式事务管理和声明式事务管理。

    1. 编程式事务管理:
      在编程式事务管理中,开发人员需要手动控制事务的开始、提交或回滚操作。
      事务的提交时机由开发人员决定,可以在方法执行结束后手动提交事务,也可以在事务成功执行的某个关键点进行提交。

    示例代码如下:

    // 获取事务管理器
    PlatformTransactionManager txManager = new DataSourceTransactionManager(dataSource);
    // 获取事务定义
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    // 设置事务传播行为和隔离级别
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
    // 开启事务
    TransactionStatus status = txManager.getTransaction(def);
    try {
        // 执行数据库操作
        // ...
        // 提交事务
        txManager.commit(status);
    } catch (Exception e) {
        // 回滚事务
        txManager.rollback(status);
        throw e;
    }
    
    1. 声明式事务管理:
      在声明式事务管理中,通过配置事务增强器来实现事务的管理。
      事务的提交时机由事务管理器自动控制,一般是在方法执行结束后自动提交事务,或者在方法执行过程中出现异常时自动回滚事务。

    示例代码如下:

    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private UserDao userDao;
    
        @Override
        public void addUser(User user) {
            // 执行数据库操作
            // ...
        }
    }
    

    在上述代码中,使用了@Transactional注解来声明事务,并且配置了默认的事务传播行为和隔离级别。当addUser方法执行结束时,会由事务管理器自动提交事务。

    脏写和幻读是事务并发过程中的两个重要问题,事务隔离级别是解决并发问题的一个重要手段。Spring事务默认的隔离级别是ISOLATION_DEFAULT,即使用底层数据源的默认隔离级别。在Spring中,可以使用@Transactional注解的isolation属性,或者在编程式事务管理中通过DefaultTransactionDefinitionsetIsolationLevel方法来设置事务的隔离级别。

    总结:Spring事务的提交时机取决于事务的管理方式和提交策略,编程式事务需要手动控制事务的提交或回滚,而声明式事务由事务管理器自动控制提交时机。事务隔离级别是解决并发问题的一个重要手段,可以在代码中显式设置或通过注解来配置。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部