マッピングによると、操作のシーケンスは次のようになります。
Person p = DAO.findPerson(id);
Car car = new Car();
car.setPerson(p);
DAO.saveOrUpdate(car);
p.getCars().add(car);
Car firstCar = p.getCars().get(0);
firstCar.setPerson(null);
p.getCars().remove(firstCar);
if (p.officialCar.equals(firstCar)) {
p.officialCar = null;
p.officialCar.person = null;
}
DAO.delete(firstCar);
更新 または削除 排他的ロックを取得することを意味します 、 READ_COMMITTED
でも
分離レベル。
別のトランザクションが現在実行中のトランザクション(問題のこの行をすでにロックしている)で同じ行を更新する場合、デッドロックは発生しませんが、ロック取得タイムアウト 例外。
デッドロックが発生したため、複数のテーブルでロックを取得し、ロックの取得が適切に順序付けられていないことを意味します。
したがって、DAOメソッドではなく、サービスレイヤーメソッドがトランザクション境界を設定していることを確認してください。 取得を宣言されたようです および検索 SUPPORTEDを使用するメソッド。つまり、トランザクションが現在開始されている場合にのみトランザクションを使用します。それらにもREQUIREDを使用する必要があると思いますが、単にread-only = true
としてマークしてください。 。
したがって、トランザクションアスペクトがDAOではなく「mymethod」にトランザクション境界を適用することを確認してください。