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();
}
こんな感じでセッションを使いまわすことで解決。
・・・基本ですよね。。。
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();
}
こんな感じでセッションを使いまわすことで解決。
・・・基本ですよね。。。