gpt4 book ai didi

java - 当出现异常时 Spring @Trasactional 不会回滚

转载 作者:行者123 更新时间:2023-12-02 02:23:32 25 4
gpt4 key购买 nike

我是 Spring 新手,正在使用 Spring jdbc 编写示例程序。这是为了检查 spring @Trsactional 如何工作并在出现异常时回滚对 Db 的更改。

但我无法实现这一点。通过我在数据库更新之一中引发异常,它仍然将数据插入数据库而不是回滚。

我知道我在某个地方犯了错误,但无法弄清楚。不确定这是否是正确的方法。

我在做什么:-

  1. 在主要方法中,我调用 Global 类的加载方法(其中 jdbcTemplate 作为 satic 成员,因为我将此 jdbcTemplate 应用于所有其他类)

  2. 全局类加载方法将使用 ApplicationContext 启动 bean。

  3. 在 main 方法中创建 Dbclass 实例并发送 jdbcTemplate 作为参数。

4.创建一些示例数据并调用executeDb方法。

5.execute DB 方法将创建其他 Dbclass 的实例并设置 jdbcTemplate,我之前在主方法中使用 bean 初始化了该模板(我为每个操作都有单独的类 - 例如 createuser、UpdataBalance 等)

  • 然后它会调用db操作方法插入数据(我使用的是batchupdate)
  • EDIT - Removed all try-catch

    数据库操作代码:-

    @Transactional(rollbackFor={Exception.class})
    public void executeDB(int count) throws Exception
    {

    CreateAccount newacc = new CreateAccount(jdbcTemplate);
    CreateUser newusr = new CreateUser(jdbcTemplate);
    //BalanceUpdate newbal = new BalanceUpdate(jdbcTemplate);
    newacc.addList(acclist);
    newusr.addToList(usrlist);
    //newbal.addList(ballist);

    newusr.execute(); // insert data to db
    newacc.addAccount(); // insert data to db
    //newbal.addBalance(); // insert data to db

    newacc.getAccList().clear();
    newusr.getUserList().clear();
    //newbal.getBalanceList().clear();
    if(count == 5000)
    {
    Thread.sleep(1000);
    throw new Exception("Rollback");
    }
    count += 1000;
    //throw new Exception();


    }
    <!-- begin snippet: js hide: false console: true babel: false -->

    <!-- language: lang-xml -->

    <context:component-scan base-package="com.example"></context:component-scan>

    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    <property name="username" value="system"/>
    <property name="password" value="root"/>
    </bean>


    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
    </bean>

    <bean id="startit" class="com.example.springtransaction.GlobalClass">
    <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>
    <bean id="dbupdate" class="com.example.springtransaction.DbUpdate">
    <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>

    最佳答案

    您需要从方法中抛出异常,而不是默默地将其记录在 catch block 中。对于受检查的异常,您需要使用@Transactional(rollbackFor = {Exception.class})。 http://www.logicbig.com/tutorials/spring-framework/spring-data-access-with-jdbc/transactional-roll-back/ https://www.catalysts.cc/en/wissenswertes/spring-transactional-rollback-on-checked-exceptions/

    关于java - 当出现异常时 Spring @Trasactional 不会回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48118485/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com