hibernateでハマった。

try {

if(isMappingDataExists(deleteEntity)) {
new hoge1Dao().deleteByCategoryId(deleteEntity);
}
hoge2Dao.delete(deleteEntity);
trans.commit();

} catch(Exception e) {
trans.rollback();
e.printStackTrace();
} finally {
hibernateSession.close();
}


こんな感じの記述でひとつのトランザクション内で2つのテーブルを削除した時mysqlで

Lock wait timeout exceeded; try restarting transaction

なんてエラーが出たのでmysqlでロックが起きてしまって先に進めずタイムアウトしたと判断。
2つのテーブルが親子関係だったのもあり、外部キーが悪いのではないかとずっと疑いハマった。

定かではないが、原因はDaoをnewするときにhibernateとmysqlのコネクションの独立したものが2つ発生していて、競合してしまったようだ。

try {

if(isMappingDataExists(deleteEntity)) {
new hoge1Dao(hibernateSession).deleteByCategoryId(deleteEntity);
}
hoge2Dao.delete(deleteEntity);
trans.commit();

}

こんな感じでセッションを使いまわすことで解決。




・・・基本ですよね。。。