¤³¤Î¥Ú¡¼¥¸¤òdel.icio.us¤ËÄɲà ¤³¤Î¥Ú¡¼¥¸¤ò¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÄɲ䳤Υڡ¼¥¸¤ò´Þ¤à¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯ ¤³¤Î¥Ú¡¼¥¸¤òlivedoor ¥¯¥ê¥Ã¥×¤ËÄɲà ¤³¤Î¥Ú¡¼¥¸¤òYahoo!¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÄɲ䳤Υڡ¼¥¸¤ò´Þ¤àYahoo!¥Ö¥Ã¥¯¥Þ¡¼¥¯
Top / Hibernate / Èá´ÑŪ¥í¥Ã¥¯¤ò¼ÂÁõ¤¹¤ë

Èá´ÑŪ¥í¥Ã¥¯¤È¤Ï

¢¨»ä¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¤ÎÀìÌç²È¤Ç¤â¤Ê¤¤¤Ç¤¹¤·¡¢Oracle¤äHibernate¤Î¥¨¥­¥¹¥Ñ¡¼¥È¤Ç¤â¤Ê¤¤¤Î¤Ç¥³¥³¤Ë½ñ¤¤¤Æ¤¢¤ëÆâÍÆ¤ÏÀµ¤·¤¤¤«¤É¤¦¤«ÊݾڤǤ­¤Þ¤»¤ó¡£¤¢¤·¤«¤é¤º¤´Î»¾µ¤¯¤À¤µ¤¤

Hibernate/³Ú´ÑŪ¥í¥Ã¥¯¤ò¼ÂÁõ¤¹¤ë ¤Ç³Ú´ÑŪ¥í¥Ã¥¯¤Î¼ÂÁõ¤Ë¤Ä¤¤¤Æ¤Ï»î¤·¤Æ¤ß¤Þ¤·¤¿¡£¼¡¤ÏÈá´ÑŪ¥í¥Ã¥¯¤ò»î¤·¤Æ¤ß¤è¤¦¤È»×¤¤¤Þ¤¹¡£Èá´ÑŪ¥í¥Ã¥¯¤È¤Ï¡¢Ê£¿ô¤Î¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤¬Æ±¤¸row¤ò¹¹¿·¤·¤Æ¤·¤Þ¤ï¤Ê¤¤¤è¤¦¤Ë¡¢¥È¥é¥ó¥¶¥¯¥·¥ç¥óÃæ¤Ï¤½¤Îrow¤òÀêÍ­¥í¥Ã¥¯¤·¤Æ¤·¤Þ¤ª¤¦¤È¤¤¤¦ÊýË¡¤Ç¤¹¡£¤¢¤ë¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤¬¤¢¤ërow¤ËÂФ·¤ÆÈá´ÑŪ¥í¥Ã¥¯¤ò¤«¤±¤ë¤È¡¢Â¾¤Î¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Ï¤½¤Îrow¤ò»²¾È¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¥í¥Ã¥¯¤ò¼èÆÀ¤·¤¿¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤¬½ªÎ»¤¹¤ë¤Þ¤ÇÂÔ¤Á¤Ë¤Ê¤Ã¤¿¤ê¡¢»²¾È¤·¤è¤¦¤È¤·¤¿»þÅÀ¤ÇÎã³°¤Ë¤Ê¤Ã¤¿¤ê¤·¤Þ¤¹¡£¤è¤¦¤¹¤ë¤ËOracle¤Ê¤É¤Ç¤¤¤¦¤È¤³¤í¤Îselect ¡Á for update¤Î»ö¤Ç¤¹¤Í¡£

¤È¤³¤í¤Ç¤³¤ÎOracle¤Îselect for update¤Ç¤¹¤¬¡¢»ä¤Ï´ª°ã¤¤¤·¤Æ¤¤¤Þ¤·¤¿¡£¤Ä¤Þ¤ê

¥È¥é¥ó£±¤¬select for update ¤ÇÀêÍ­¥í¥Ã¥¯¤¹¤ë
¥È¥é¥ó£²¤¬select¤·¤è¤¦¤È¤·¤¿¤é¡¢ÂÔ¤ÁorÎã³°

¤À¤È»×¤Ã¤Æ¤¤¤¿¤ó¤Ç¤¹¤¬¡¢°ã¤¤¤Þ¤·¤¿¡£Àµ¤·¤¯¤Ï

¥È¥é¥ó£±¤¬select for update ¤ÇÀêÍ­¥í¥Ã¥¯¤¹¤ë
¥È¥é¥ó£²¤¬select for update ¤·¤è¤¦¤È¤·¤¿¤é¡¢ÂÔ¤ÁorÎã³°

¤Ê¤ó¤Ç¤¹¤Í¡£¤Ä¤Þ¤ê¤¢¤ë¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤¬ÀêÍ­¥í¥Ã¥¯¤ò¤·¤Æ¤â¡¢Ã±½ã¤Êselect¤Ï¼Â¹Ô¤Ç¤­¤Á¤ã¤¤¤Þ¤·¤¿¡£¤³¤ì¤Ã¤ÆÀµ¤·¤¤Æ°¤­¡©¡©¡©ÃΤäƤë¥Ò¥È¡¢¶µ¤¨¤Æ¤¯¤À¤µ¤¤¡£´Ä¶­¤ÏOracle 10g XE¤Ç¤¹¡£

Hibernate¤Ç¤ÎÈá´ÑŪ¥í¥Ã¥¯¤Î¼ÂÁõÊýË¡

Hibernate¤ÇÈá´ÑŪ¥í¥Ã¥¯¤ò¼èÆÀ¤¹¤ë¤Ë¤Ï¡¢updateÁ°¤Îselect»þ¤Ë¡¢¥í¥Ã¥¯¤¹¤ë¤È¤¤¤¦»ØÄê¤ò¤·¤Æ¤ª¤±¤ÐOK¤Ç¤¹¡£¶ñÂÎŪ¤Ë¤Ï

UserAttr user = (UserAttr) session.load(UserAttr.class, key,LockMode.UPGRADE);

¤Èload¤äget»þ¤Ë LockMode?.UPGRADE ¤È¤¤¤¦ÀêÍ­¥í¥Ã¥¯¤¹¤ë¤È¤¤¤¦»ØÄê¤ò¤¹¤ë¤À¤±¤Ç¤¹¡£

¤ä¤Ã¤Æ¤ß¤ë

¥Æ¡¼¥Ö¥ë¹½À®¤Ê¤É¤Ï Hibernate/Spring¤ò»È¤Ã¤Æ¥È¥é¥ó¥¶¥¯¥·¥ç¥ó½èÍý¤òµ­½Ò¤¹¤ë ¤Î¹½À®¤òÍѤ¤¤Æ¥µ¥ó¥×¥ë¤ò¼Â¹Ô¤·¤Æ¤ß¤Þ¤¹¡£¤ä¤Ã¤Æ¤¤¤ëÆâÍÆ¤Ï

  • ¥È¥é¥ó¥¶¥¯¥·¥ç¥ó£±¤Î¥¹¥ì¥Ã¥É¤¬¤¢¤ërow¤ò
     session.load(UserAttr.class, key,LockMode.UPGRADE);
    ¤È¤¤¤¦»ØÄê¤Ç¸¡º÷
  • ¥È¥é¥ó¥¶¥¯¥·¥ç¥ó£²¤Î¥¹¥ì¥Ã¥É¤¬Æ±¤¸row¤ò
     session.load(UserAttr.class, key,LockMode.UPGRADE);
    ¤È¤¤¤¦»ØÄê¤Ç¸¡º÷¡£¤³¤³¤Ç¤³¤Î¥È¥é¥ó¥¶¥¯¥·¥ç¥ó£²¤ÏÂÔ¤Á¾õÂ֤ˤʤë
  • ¥È¥é¥ó¥¶¥¯¥·¥ç¥ó£±¤Î¥¹¥ì¥Ã¥É¤¬¤½¤Îrow¤òÊѹ¹¤·¤Æ¥³¥ß¥Ã¥È
  • ¥È¥é¥ó¥¶¥¯¥·¥ç¥ó£²¤ÎÂÔ¤Á¾õÂÖ¤¬²ò½ü¤µ¤ì¡¢¤³¤Î¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤Î¾å¤Î¸¡º÷¤¬¼Â¹Ô¤µ¤ì¡¢¥È¥é¥ó¥¶¥¯¥·¥ç¥ó£±¤ÎÊѹ¹¤òÈ¿±Ç¤µ¤»¤¿¥¤¥ó¥¹¥¿¥ó¥¹¤¬¼èÆÀ¤µ¤ì¤ë

¤È¤¤¤¦¤³¤È¤Ç¤¹¤Í¡£

¥½¡¼¥¹

¾ÜºÙ¤Ï¥½¡¼¥¹¤ò¸«¤ÆÍߤ·¤¤¤Ç¤¹¤¬¡¢È´¿è¤¹¤ë¤È¤³¤ó¤Ê´¶¤¸¤Ç¤¹¡£

new Thread(new Runnable() {
  public void run() {
    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    System.out.println("¥È¥é1³«»Ï");
    // select for update¤¹¤ë
    UserAttr user = (UserAttr) session.load(UserAttr.class, key, LockMode.UPGRADE);
    System.out.println("¥È¥é1¤Î¼èÆÀ·ë²Ì" + user);
    // ¤³¤Î¥È¥é¥ó¥¶¥¯¥·¥ç¥óÆâ¤Ç¥«¥é¥à¤òÊѹ¹¤·
    user.setName("Thread1:" + System.currentTimeMillis());
    waitt(3000);

    // ¾å¤Ç3000ms¤ï¤¶¤ÈÂÔ¤Á¤Ë¤·¤¿¤³¤Î¥¹¥­¤Ë¥È¥é¥ó¥¶¥¯¥·¥ç¥ó£²¤Î¥¹¥ì¥Ã¥É¤¬Æ°¤­½Ð¤¹
    // ¤³¤Î´Ö¤Ë¥¢¥¯¥»¥¹¤·¤¿¥È¥é¥ó¤Ï¥í¥Ã¥¯²ò½üÂÔ¤Á¤Ë¤Ê¤ë¤Ï¤º
    tx.commit();
    session.close();
    System.out.println("¥È¥é1½ªÎ»");
    // ºÇ¸å¤Ëɽ¼¨¤¹¤ë¡£
    print();
    System.out.println("¥È¥é1½ªÎ»");

  }

}).start();

new Thread(new Runnable() {
  public void run() {
    waitt(1000);
    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    System.out.println("¥È¥é2³«»Ï");
    // ÉáÄ̤Ëselect¤·¤è¤¦¤È¤¹¤ë¡£ÂÔ¤Á¤Ë¤Ï¤¤¤ë¤Ï¤º
    UserAttr user = (UserAttr) session.load(UserAttr.class, key,
        LockMode.UPGRADE);// ¥³¥³¤â¥í¥Ã¥¯¤ò¤Ä¤±¤Ê¤¤¤È¡¢¸¡º÷¤Ç¤­¤Á¤ã¤¦¤ó¤À¤Í¡£
    System.out.println("¥È¥é2¤Î¼èÆÀ·ë²Ì" + user);
    tx.commit();
    session.close();
    System.out.println("¥È¥é2½ªÎ»");
  }
}).start();

¼Â¹Ô·ë²Ì

¼Â¹Ô·ë²Ì¤Ï°Ê²¼¤ÎÄ̤ê

org.hibernate.impl.SessionFactoryImpl - building session factory
¥æ¡¼¥¶ºîÀ®¤Î¥È¥é¥ó³«»Ï
org.hibernate.SQL - insert into MKINO.USER_ATTR (NAME, USERID) values (?, ?)
¥æ¡¼¥¶ºîÀ®¤Î¥È¥é¥ó½ªÎ»
Key¤Ï abc40619
¥È¥é1³«»Ï
[Thread-0] DEBUG org.hibernate.SQL - select userattr0_.USERID as USERID0_0_, userattr0_.NAME as NAME0_0_ 
  from MKINO.USER_ATTR userattr0_ where userattr0_.USERID=? for update
¥È¥é1¤Î¼èÆÀ·ë²Ìnu.mine.kino.entity.UserAttr@10e35d5[id=abc40619,name=¥µ¥ó¥×¥ë¥æ¡¼¥¶]
¥È¥é2³«»Ï
[Thread-1] DEBUG org.hibernate.SQL - select userattr0_.USERID as USERID0_0_, userattr0_.NAME as NAME0_0_ 
  from MKINO.USER_ATTR userattr0_ where userattr0_.USERID=? for update
[Thread-0] DEBUG org.hibernate.SQL - update MKINO.USER_ATTR set NAME=? where USERID=?
¥È¥é2¤Î¼èÆÀ·ë²Ìnu.mine.kino.entity.UserAttr@6a3960[id=abc40619,name=Thread1:1178297648171]
¥È¥é1½ªÎ»
¥È¥é2½ªÎ»

¤³¤Î¤è¤¦¤Ë

  • select¤Ïload¥á¥½¥Ã¥É¤Î»ØÄê¤Ë¤è¤ê¡¢select for update¤Ë¤Ê¤Ã¤Æ¤¤¤ë
  • ¥È¥é¥ó¥¶¥¯¥·¥ç¥ó£±¤ÎÅÓÃæ(¥¹¥ì¥Ã¥É¤òÂÔ¤¿¤»¤Æ¤ë¤«¤é)¤Ë¥È¥é¥ó¥¶¥¯¥·¥ç¥ó£²¤ò³«»Ï¤·¤¿¤Ë¤â¤«¤«¤ï¤é¤º¡¢¥È¥é¥ó£±¤Îupdate¤¬¥³¥ß¥Ã¥È¤µ¤ì¤ë¤Þ¤Ç¡¢¥È¥é¥ó£²¤Ï·ë²Ì¤ò¼èÆÀ¤Ç¤­¤Æ¤¤¤Ê¤¤¡£
  • ¤½¤Î¤¿¤á¥È¥é¥ó£²¤Îselect for update ¤Ï¥È¥é¥ó£±¤Îupdate¤¬È¿±Ç¤µ¤ì¤¿¥â¥Î¤¬¼èÆÀ¤µ¤ì¡¢É½¼¨¤µ¤ì¤¿

¤È¤Ê¤ê¤Þ¤·¤¿¡£³Î¤«¤Ë¥È¥é¥ó¥¶¥¯¥·¥ç¥ó£²¤ÏÂÔ¤Á¾õÂ֤ˤʤ俤褦¤Ç¤¹¡£

ÂÔ¤Á¤Ç¤Ï¤Ê¤¯¡¢¤¢¤­¤é¤á¤ë

ÂÔ¤Á¾õÂ֤ˤ¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¤¹¤°¤Ë¤¢¤­¤é¤á¤ë¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¥í¥Ã¥¯¤Î»ØÄê¤ò

Á°:session.load(UserAttr.class, key,LockMode.UPGRADE);
¸å:session.load(UserAttr.class, key,LockMode.UPGRADE_NOWAIT);

¤ËÊѹ¹¤·¤Þ¤¹¡£¼Â¹Ô¤¹¤ë¤È

Exception in thread "Thread-1" org.hibernate.exception.LockAcquisitionException:
could not load an entity: [nu.mine.kino.entity.UserAttr#abc384]

¤È¤¤¤¦Îã³°¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤·¤¿¡£


¤³¤Îµ­»ö¤Ï

ÁªÂò»è Åêɼ
¤ª¤â¤·¤í¤«¤Ã¤¿ 31  
¤½¤¦¤Ç¤â¤Ê¤¤ 3  
  • ¥È¥é£±¤¬SELECT¡ÁFOR UPDATE¤·¤¿¤È¤­¡¢¥È¥é£²¤¬FOR UPDATE¤Ê¤·¤ÎSELECT¤Ê¤é¤Ð¹¹¿·Á°¤Î¥ì¥³¡¼¥É¤òÆÉ¤ß¤Þ¤¹¡£SELECT¡ÁFOR UPDATE¤Ê¤é¤Ð¥È¥é£±¤¬COMMIT/ROLLBACK¤¹¤ë¤Þ¤ÇÂÔµ¡¤·¤Þ¤¹¡£SELECT¡ÁFOR UPDATE NOWAIT¤¹¤ë¤ÈÂÔµ¡¤»¤º¤ËORA-OOO54¡Ê¥ê¥½¡¼¥¹¡¦¥Ó¥¸¡¼¡Ë¤È¤Ê¤ê¤Þ¤¹¡£SELECT¡ÁFOR UPDATE WAIT n¤Ê¤é¤Ð¡¢nÉÃÂÔµ¡¸å¡¢ORA-OOO54¡Ê¥ê¥½¡¼¥¹¡¦¥Ó¥¸¡¼¡Ë¤È¤Ê¤ê¤Þ¤¹¡£UPDATE/DELETE¤ÏÂÔµ¡»þ´Ö¤ò»ØÄê¤Ç¤­¤Ê¤¤¤Î¤Ç̵¸Â¤ËÂÔµ¡¤·¤Þ¤¹¡£¤³¤ì¤ÇÊ䭤ˤʤê¤Þ¤¹¤Ç¤·¤ç¤¦¤«¡£ -- 2008-03-12 (¿å) 00:45:28
  • ¼ã´³Äɲᣡ֥ȥ飱¤¬SELECT¡ÁFOR UPDATE¤·¤¿¤È¤­¡¢¥È¥é£²¤¬FOR UPDATE¤Ê¤·¤ÎSELECT¤Ê¤é¤Ð¡×¤É¤¦ÆÉ¤à¤«¡¢¤Ï¡¢ÆÉ¤ß¹þ¤ß°ì´ÓÀ­¤ÎÀßÄê¤Ë¤â¤è¤ê¤Þ¤¹¡£¡Ö¥È¥é¥ó¥¶¥¯¥·¥ç¥óʬΥ¥ì¥Ù¥ë¡×¤Ç¥°¥°¤Ã¤Æ¤ß¤ë¤È¤¤¤í¤¤¤í¤È½ñ¤¤¤Æ¤¢¤ê¤Þ¤¹¡£¤ï¤«¤ê¤ä¤¹¤¤¤Î¤Ï¤³¤ÎÊÕ¤«¤Ê¡©¡¡http://d.hatena.ne.jp/zecl/20080204/p3 -- 2008-07-31 (ÌÚ) 17:36:37
  • Ⱦǯ°Ê¾å¤¿¤Ã¤Æµµ¥ì¥¹¤Ç¤¹¤¬¡¢¡¢¡¢¥È¥é£²¤¬for Update¤Ä¤±¤Ê¤¤¤Çselect¤¹¤ë¾ì¹ç¤Ï¡ÖÆÉ¤ß¤¿¤¤¤À¤±¡×¤Ê¤ó¤Ç¡¢¥³¥ß¥Ã¥ÈÁ°¤Ê¤é¡Ö¹¹¿·Á°¥ì¥³¡¼¥É¤òÆÉ¤à¡×¥³¥ß¥Ã¥È¸å¤Ê¤é¡Ö¹¹¿·¸å¥ì¥³¡¼¥É¤òÆÉ¤à(READ COMMITTED¤È¤«¤Ê¤é)¡×¤Ã¤Æ¤³¤È¤Ç¤¹¤Í¡£¤´»ØÅ¦¡¢¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤·¤¿¡ª -- ¤­¤Î? 2009-04-15 (¿å) 17:05:37

¤³¤Î¥Ú¡¼¥¸¤òdel.icio.us¤ËÄɲà ¤³¤Î¥Ú¡¼¥¸¤ò¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÄɲ䳤Υڡ¼¥¸¤ò´Þ¤à¤Ï¤Æ¤Ê¥Ö¥Ã¥¯¥Þ¡¼¥¯ ¤³¤Î¥Ú¡¼¥¸¤òlivedoor ¥¯¥ê¥Ã¥×¤ËÄɲà ¤³¤Î¥Ú¡¼¥¸¤òYahoo!¥Ö¥Ã¥¯¥Þ¡¼¥¯¤ËÄɲ䳤Υڡ¼¥¸¤ò´Þ¤àYahoo!¥Ö¥Ã¥¯¥Þ¡¼¥¯
Top / Hibernate / Èá´ÑŪ¥í¥Ã¥¯¤ò¼ÂÁõ¤¹¤ë

¸½ºß¤Î¥¢¥¯¥»¥¹:18134


¥È¥Ã¥×   ÊÔ½¸ Åà·ë º¹Ê¬ ¥Ð¥Ã¥¯¥¢¥Ã¥× źÉÕ Ê£À½ ̾Á°Êѹ¹ ¥ê¥í¡¼¥É   ¿·µ¬ °ìÍ÷ ñ¸ì¸¡º÷ ºÇ½ª¹¹¿·   ¥Ø¥ë¥×   ºÇ½ª¹¹¿·¤ÎRSS
Last-modified: 2012-03-14 (¿å) 10:05:01 (66d)