2016-09-10 30 views
1

DML文がロールバックされない理由を文字通り無駄にしています。私はインターネット上でも、stackoverflow上でも徹底的な検索を行っていますが、私はその周りを頭で囲むことができません。@トランザクションがロールバックされない

try catchや@ExceptionHandlerや@ControllerAdviceを使用して、以下の例外をキャッチしようとしていません。なぜ私のクエリがロールバックされないのかわかりません。この質問は、重複のように聞こえるが、stackoverflowの上の他の記事のどれも私の問題

spring.xml

<bean id="employeeImpl" class="org.daoImpl.EmployeeImpl"> 
    <property name="dataSource" ref="dataSource"></property> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

コントローラ

@RequestMapping(value = "/formSubmit", method = RequestMethod.POST) 
public ModelAndView handleForm(@ModelAttribute("employee") Employee employee) { 

    ModelAndView modelAndView = new ModelAndView("Success"); 
    employeeImpl.insertEmployee(employee); 
    return modelAndView; 
} 

そして最後にロールバックする必要のあるメソッドを解決することができませんでした

@Transactional(rollbackFor=RuntimeException.class) 
public void insertEmployee(Employee emp) { 
    String SQL = "insert into employee values(?,?,?,?,?)"; 
    getJdbcTemplate().update(SQL, new Object[] { emp.getId(),emp.getFname()); 
    throw new RuntimeException("I am throwing you out!"); 
} 

私は自分のデータベースとしてMySQLを使用しています。

実行時例外がスローされた後でも、挿入クエリはデータベースに残っていますが、ロールバックを正しく行う必要がありますか?誰かが私に不足していることを教えてください。

+0

RunTimeExceptionを明示的に指定する必要はありません。基礎となるデータベースとエンジンが何であるか不思議です。 –

+0

トランザクションをサポートしていないMyISAMエンジンを使用している可能性を排除したいだけでした。 –

+0

MyISAMエンジンを使用しています。 InnoDBをエンジンとしたテーブルを作り直してみましょう。ありがとうTJ –

答えて

0

テーブルのエンジンがMyISAMであるため、トランザクションがロールバックされませんでした。この特定のエンジンは、TJが正しく指摘したトランザクションをサポートしていません(私は知らなかった)

テーブルのエンジンをInnoDBに変更しました。トランザクションが期待通りにロールバックされています。

ありがとうもうTJ!

関連する問題