zoukankan      html  css  js  c++  java
  • Transactional 事务

    1、事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚

    其实像第一种try catch这种把整个包裹起来,这种业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出,全被捕获并“吞掉”,导致spring异常抛出触发事务回滚策略失效。

    @Transactional(readOnly = false)
        public void delete(Comment entity, Boolean isRe) {
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            // explicitly setting the transaction name is something that can only be done programmatically
            def.setName("SomeTxName");
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
            TransactionStatus status = transactionManager.getTransaction(def);
            try {
                super.delete(entity);
            } catch (Exception ex) {
                // 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚 inspection
                transactionManager.rollback(status);
                throw ex;
            }
        }
    

      2、事务传播行为:

    int PROPAGATION_REQUIRED = 0;// 必需的--如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
    int PROPAGATION_SUPPORTS = 1;// 支持当前事务,如果当前没有事务,就以非事务方式执行。
    int PROPAGATION_MANDATORY = 2;// 强制的、命令的--使用当前的事务,如果当前没有事务,就抛出异常。
    int PROPAGATION_REQUIRES_NEW = 3;// 新建事务,如果当前存在事务,把当前事务挂起。
    int PROPAGATION_NOT_SUPPORTED = 4;// 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    int PROPAGATION_NEVER = 5;// 以非事务方式执行,如果当前存在事务,则抛出异常。
    int PROPAGATION_NESTED = 6;// 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

    3、
    www.beicaiduo.com
  • 相关阅读:
    [CF1398E] Two Types of Spells
    [CF1399E2] Weights Division (hard version)
    [CF1400E] Clear the Multiset
    Review 2020.10.29
    Review 2020.10.11
    [CF1409F] Subsequences of Length Two
    [CF1413E] Solo mid Oracle
    [2020CCPC威海C] Rencontre
    [2020CCPC威海B] Labyrinth
    phpredis实现简单的消息队列
  • 原文地址:https://www.cnblogs.com/hoge66/p/9921404.html
Copyright © 2011-2022 走看看