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
この記事へのコメント
これは勉強になりました。イマイチInnoDBエンジンとmyisamの区別がわからない。。phpMyAdminでFKを張ろうとするときはInnoDBにしないとできないのはついこの前わかったことです。
Posted by kinopyo at 2010年10月23日 15:54
自分もトランザクション制御が可能くらいしか、、、あとmyisamのときにselect for updateでレコードロックかけようとしたら出来なかった気がする。
Posted by しお at 2010年10月25日 20:18
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/41443358

この記事へのトラックバック