0

こんにちは、Hibernate を使用してテーブル内のレコードを更新しています。そして、同じレコードを別のテーブルに挿入しています。ループしていますが、レコードを更新しているときにロック待ちタイムアウト例外として例外が発生しています。誰でもこの問題を解決できますか?前もって感謝します!

try {
            SalesInventoryDAO dao = new SalesInventoryDAO();
            sess = HibernateUtil.getSessionFactory().openSession();
           Transaction tx = ses.beginTransaction();
            GoodsRecievedForm item = (GoodsRecievedForm) form;
            GoodsRecieved bk = new GoodsRecieved();
            bk.setGoodsId(item.getGoodsId());
            InventoryOrder order = (InventoryOrder) sess.get(InventoryOrder.class, item.getOrderNo());
            bk.setOrderNo(order);
//            if (order.getQuotation().getQuotationNo() != null) {
//                bk.setQuotation(order.getQuotation().getQuotationNo());
//            } else {
//                bk.setQuotation(null);
//            }

            java.util.Date temp = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse(item.getRecievedDate());
            java.sql.Date temp1 = new java.sql.Date(temp.getTime());
            bk.setRecievedDate(temp1);
            bk.setOrderQty(order.getTotalqty());
            bk.setReceivedPersonName(item.getReceivedPersonName());
            bk.setReceivedQty(item.getReceivedQty());
            bk.setConditionOfMaterial(item.getConditionOfMaterial());
            UserEntity msg;
            HttpSession session = request.getSession(false);
            msg = (UserEntity) session.getAttribute("user");
            bk.setAddedBy(msg);
            bk.setAddedDate(new Date());
            int[] item1111 = item.getGoodsDetails();
            String[] productre = item.getGoodsDetailsName();
            float proqty[] = item.getGoodsDetailsQty();
            float price[] = item.getGoodsDetailsPrice();
            float receivedqty[] = item.getReceivedquantity();
            GoodsReceivedDetails mb;
            Set<GoodsReceivedDetails> purDetails = new HashSet();
            for (int i = 0; i < productre.length; i++) {
                mb = new GoodsReceivedDetails();
                mb.setGoodsDetailsName(productre[i]);
                mb.setGoodsDetailsQty(proqty[i]);
                mb.setGoodsDetailsPrice(price[i]);
                mb.setReceivedquantity(receivedqty[i]);
                //System.out.println("productre" + productre[i]);
                int id3 = item1111[i];
                //System.out.println("id3id3id3id3" + id3);
                // int id3 = Integer.parseInt(productre[i]);
                Item idf = (Item) sess.get(Item.class, id3);
                float qty = (idf.getItemStock() + mb.getReceivedquantity());
//                mb.setItemId(idf);
//                mb.setItemId(idf);
                dao.updateitem(qty, idf);
                //dao.updateitem(idf);
                mb.setGoodsId(bk);
                sess.save(mb);
                purDetails.add(mb);
            }

            bk.setGoodsDetails(purDetails);
            sess.save(bk);
          tx.commit;

            //System.out.println("comming");
//            List ls = gdao.getOrderItems(order.getOrderId());
//            for (Iterator it = ls.iterator(); it.hasNext();) {
//                InventoryOrderDetails inv = (InventoryOrderDetails) it.next();
//                gdao.updateitem(inv.getItemId().getItemStock() + bk.getReceivedQty(), inv.getItemId());
//            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sess.close();
        }

これは私のdaoコードです..

public void updateitem(float stock, Item itm) {
        Session ses = HibernateUtil.getSessionFactory().openSession();
        ////System.out.println("itmitmitm" + itm.getItemId());
        Transaction tx = ses.beginTransaction();
        Query qry = ses.createQuery("UPDATE Item set itemStock='" + stock + "' where itemId='" + itm.getItemId() + "'");
        qry.executeUpdate();
        ses.close();
        tx.commit();

    }
4

2 に答える 2

0

最初にトランザクションを初期化し、トランザクションsess.beginTransaction();をコミットする前に、トランザクションを再初期化しようとしました。以前のトランザクションがコミットされていないため、メモリ リークが発生します。したがって、別のトランザクションを開始する前に、前のトランザクションをコミットしてください。

そして、ここにいくつかの提案があります:

  • 「ロック待機タイムアウト」は通常、他のトランザクションによってすでにロックされているデータ行の更新をトランザクションが待機しているときに発生します。
  • ほとんどの場合、問題はデータベース側にあります。考えられる原因として、不適切なテーブル設計、大量のデータ、制約などが考えられます。

詳しくはこちらをご覧ください。

于 2013-10-29T06:58:39.587 に答える