myBatis の挿入/更新関数で FK を DB に追加した後にコミットが必要になるのはなぜですか?
質問
永続化のために myBatis を使用するプロジェクトがあります。以下のメソッド「A」は、外部キーを追加してテーブルを myISAM から innoDB に変換するまでは正常に動作していました。変換後、メソッド「A」はログに警告も出力されずに、サイレントに失敗します。変換後は、メソッド「B」のみが正常に挿入されます。どちらの方法でも正しい SQL がログに書き込まれますが、機能するのは「B」のみです。
以前はコミットする必要がなかったのに、今はコミットする必要がある理由を誰かが説明してもらえますか?
//doesnt work, but worked previously
public void A(Role role) {
SqlSession session = sqlSessionFactory.openSession();
try {
RoleMapper mapper = session.getMapper(RoleMapper.class);
mapper.updateByPrimaryKeySelective(role);
}catch(Exception e){
logger.error(e);
} finally {
session.close();
}
return;
}
//works correctly, but why?
public void B(Role role) {
SqlSession session = sqlSessionFactory.openSession();
try {
RoleMapper mapper = session.getMapper(RoleMapper.class);
mapper.updateByPrimaryKeySelective(role);
session.commit();
}catch(Exception e){
logger.error(e);
} finally {
session.close();
}
return;
}
解決
myISAM はトランザクションではありません。自動コミットはデフォルトでオンになっています (実際には、すべてのステートメントがコミットされるため、JDBC ドライバーによって無視されます)。innoDB はトランザクション対応であり、自動コミットもデフォルトではオフになっています。これは、session.commit() を呼び出す必要があることを意味します。そうしないと、DB は実際には更新を実行しません。
見る このブログエントリー 詳細については。
自動コミットに任せるのではなく、コミットを呼び出す必要があることに注意してください。自動コミットをオフのままにすると、接続が再利用されるときにステートメントが不明な状態のままになる可能性があるため、接続プーリングで問題が発生します。
所属していません StackOverflow