myBatis の挿入/更新関数で FK を DB に追加した後にコミットが必要になるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/4372640

  •  09-10-2019
  •  | 
  •  

質問

永続化のために 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 は実際には更新を実行しません。

見る このブログエントリー 詳細については。

自動コミットに任せるのではなく、コミットを呼び出す必要があることに注意してください。自動コミットをオフのままにすると、接続が再利用されるときにステートメントが不明な状態のままになる可能性があるため、接続プーリングで問題が発生します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top