Spring @Transactional - 回滚没有发生

时间:2018-01-25 18:28:24

标签: java spring jdbc transactions spring-transactions

我是Spring和使用Spring jdbc开发示例程序的新手。这是为了检查spring @Trsactional如何工作并在有异常的情况下将更改回滚到Db。

但我无法做到这一点。通过我在其中一个数据库更新中引发异常,它仍然将数据插入到数据库中,而不是为该批处理回滚。对于前者在插入5000之后我会引发异常,所以理想情况下它应该将所有更改(对于当前批处理)回滚到所有表,并且Db中的总行数应该是4000.

我知道某个地方我犯了错误但却无法理解。不确定这是否是正确的方法。

我尝试了互联网上所有可能的方法,但仍然没有运气。请帮我解决这个问题。

  

以下是我的示例应用https://github.com/rajarshp/JavaSample

代码段

@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();


        }

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>

1 个答案:

答案 0 :(得分:0)

为xml文件中的所有Db操作类创建bean,例如createUser或Cretae帐户。从db操作类中删除这些类的初始化,并使用setter方法从xml中注入它。发布调用db操作方法的帖子。它应该工作。

<bean id="newaccount" class="com.example.springtransaction.CreateAccount">  
<property name="jdbcTemplate" ref="jdbcTemplate"></property>  
</bean> 
<bean id="newuser" class="com.example.springtransaction.CreateUser">  
<property name="jdbcTemplate" ref="jdbcTemplate"></property>  
</bean> 
<bean id="dbupdate" class="com.example.springtransaction.DbUpdate">  
<property name="newaccount" ref="newacc"></property>  
<property name="newuser" ref="newusr"></property>  
</bean>