1

在我的 Web 应用程序中,我使用Stateless sessionswithHibernate以在我的insertsupdates.

它可以正常工作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)。 并且只是没有数据库内容的算法函数。 函数是使用函数从数据库中获取一些数据的函数。RawMaterialTypePriceHistorycomputeDeltacomputePriceretrieveAllWithHistoryPlay framework model

因此,此代码检索一些数据,编辑一些数据,创建一个新数据,最后保存所有内容。

为什么我有一个锁定异常MySQL而没有异常H2

4

1 回答 1

0

我不确定你为什么要在一个finally块中提交。试试这个结构:

try {
    factory.getCurrentSession().beginTransaction();
    factory.getCurrentSession().getTransaction().commit();
} catch (RuntimeException e) {
    factory.getCurrentSession().getTransaction().rollback();
    throw e; // or display error message
}

此外,查看此文档可能对您有所帮助。

于 2013-10-29T17:04:31.697 回答