1

以下の構成で春にトランザクション管理が失敗する理由。RuntimeException がスローされても、トランザクションはロールバックされません。さて、私は学習目的で手動で投げています。

私のダオクラス:

@Transactional(rollbackFor=ArithmeticException.class)
public class TransactionAnnotationDaoImpl extends  JdbcDaoSupport implements JdbcDao {

public void create(Student student) {


try {
    String sql = "insert into student values (?,?,?)";
    getJdbcTemplate().update(sql,student.getAge(), student.getName(), student.getId());
    String marksSql="insert into marks values (?,?,?)";
        int i=2/0; //added to depict roll back behaviour of the transaction when exception occurs
                          getJdbcTemplate().update(marksSql,student.getId(),student.getSubject(),student.getMarks());

            System.out.println("transaction committed");
        } catch (RuntimeException e) {
            e.printStackTrace();

            System.out.println("transaction rolled back");
        }
    }

}

私の春の設定ファイルの内容:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver"></property>
    <property name="url" value="jdbc:derby://localhost:1527/db;create=true"></property>
</bean>


<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="annotationTransactionDaoImpl" class="org.sujay.springjdbc.dao.TransactionAnnotationDaoImpl">
  <property name="dataSource" ref="dataSource"></property></bean>

次の呼び出しで main メソッドから dao を呼び出しています。

 JdbcDao annotationDao = context.getBean("annotationTransactionDaoImpl", JdbcDao.class);
 annotationDao.create(new Student(25, "p", 4, 19, "cn2"));

ただし、トランザクションはロールバックされません。学生テーブルにはエントリがありますが、マーク テーブルにはありません。これは、トランザクションが失敗したことを意味します。この問題で私を助けてください。

4

1 に答える 1

0

例外をキャッチしたためです。

try catch を削除するか、例外を再スローします。

try{
     ...
} catch (RuntimeException e) {
        e.printStackTrace();
        System.out.println("transaction rolled back");

        throw e; //rethrow so spring will recognize it
}
于 2013-06-30T05:20:13.107 に答える