在我的 Web 应用程序中,我使用Stateless sessions
withHibernate
以在我的inserts
和updates
.
它可以正常工作H2 database
(在开发模式下的游戏框架中使用的那个)。
但是当我使用它进行测试时,MySQL
我得到以下异常:
ERROR ~ Lock wait timeout exceeded; try restarting transaction
ERROR ~ HHH000315: Exception executing batch [Lock wait timeout exceeded; try restarting transaction]
这是代码:
public static void update() {
Session session = (Session) JPA.em().getDelegate();
StatelessSession stateless = this.session.getSessionFactory().openStatelessSession();
try {
stateless.beginTransaction();
// Fetch all products
{
List<ProductType> list = ProductType.retrieveAllWithHistory();
for (ProductType pt : list) {
updatePrice(pt, stateless);
}
}
// Fetch all raw materials
{
List<RawMaterialType> list = RawMaterialType.retrieveAllWithHistory();
for (RawMaterialType rm : list) {
updatePrice(rm, stateless);
}
}
} catch (Exception ex) {
play.Logger.error(ex.getMessage());
ExceptionLog.log(ex, Thread.currentThread());
} finally {
stateless.getTransaction().commit();
stateless.close();
}
}
private static void updatePrice(ProductType pt, StatelessSession stateless) {
pt.priceDelta = computeDelta();
pt.unitPrice = computePrice();
stateless.update(pt);
PriceHistory ph = new PriceHistory(pt, price);
stateless.insert(ph);
}
private static void updatePrice(RawMaterialType rm, StatelessSession stateless) {
rm.priceDelta = computeDelta();
rm.unitPrice = computePrice();
stateless.update(rm);
PriceHistory ph = new GoodPriceHistory(rm, price);
stateless.insert(ph);
}
在这个例子中,我有 3 个简单的实体(和ProductType
)。
并且只是没有数据库内容的算法函数。
函数是使用函数从数据库中获取一些数据的函数。RawMaterialType
PriceHistory
computeDelta
computePrice
retrieveAllWithHistory
Play framework model
因此,此代码检索一些数据,编辑一些数据,创建一个新数据,最后保存所有内容。
为什么我有一个锁定异常MySQL
而没有异常H2
?