2010年10月22日

MySQLでのトランザクション制御

どうも、塩内藤です。

MySQLでのトランザクション制御でハマりました。。。

springのconfigファイル以下のような設定をして、対象のメソッドに@Transactionalを付与して制御しようと思ったんですが、全然効かない、、、

<tx:annotation-driven transaction-manager="TransactionManager"/>
<bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

springのソースをダウンロードしてきてorg.springframework.transaction.interceptor.TransactionInterceptor#invokeにブレークポイントはっつけて
デバッグしたんですが、ちゃんとハンドドリングしてcompleteTransactionAfterThrowingを呼び出してる模様

2時間くらい悩んでよくよく調べると原因はMySQL側にありました。。。

どうも、テーブルをcreateだけだとMySQLのストレージエンジンがトランザクションに対応してないようでテーブル作成後にエンジンの変更しないといけないみたいです。そんなの知らなんだ。。。

ちなみにトランザクションに対応しているエンジンはInnoDBだそうで

ということで、下記のクエリーを実行して解決しました。

ALTER TABLE FOO_TABLE ENGINE = InnoDB;

2時間程度のハマりですんでよかった。
posted by しお at 13:51| Comment(2) | TrackBack(0) | MySQL