Èá´ÑŪ¥í¥Ã¥¯¤È¤Ï †¢¨»ä¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¤ÎÀìÌç²È¤Ç¤â¤Ê¤¤¤Ç¤¹¤·¡¢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¤ò»È¤Ã¤Æ¥È¥é¥ó¥¶¥¯¥·¥ç¥ó½èÍý¤òµ½Ò¤¹¤ë ¤Î¹½À®¤òÍѤ¤¤Æ¥µ¥ó¥×¥ë¤ò¼Â¹Ô¤·¤Æ¤ß¤Þ¤¹¡£¤ä¤Ã¤Æ¤¤¤ëÆâÍÆ¤Ï
¤È¤¤¤¦¤³¤È¤Ç¤¹¤Í¡£ ¥½¡¼¥¹ †¾ÜºÙ¤Ï¥½¡¼¥¹¤ò¸«¤ÆÍߤ·¤¤¤Ç¤¹¤¬¡¢È´¿è¤¹¤ë¤È¤³¤ó¤Ê´¶¤¸¤Ç¤¹¡£ 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½ªÎ» ¤³¤Î¤è¤¦¤Ë
¤È¤Ê¤ê¤Þ¤·¤¿¡£³Î¤«¤Ë¥È¥é¥ó¥¶¥¯¥·¥ç¥ó£²¤ÏÂÔ¤Á¾õÂ֤ˤʤ俤褦¤Ç¤¹¡£ ÂÔ¤Á¤Ç¤Ï¤Ê¤¯¡¢¤¢¤¤é¤á¤ë †ÂÔ¤Á¾õÂ֤ˤ¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¤¹¤°¤Ë¤¢¤¤é¤á¤ë¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¥í¥Ã¥¯¤Î»ØÄê¤ò Á°: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] ¤È¤¤¤¦Îã³°¤¬¥¹¥í¡¼¤µ¤ì¤Þ¤·¤¿¡£ ¤³¤Îµ»ö¤Ï
¸½ºß¤Î¥¢¥¯¥»¥¹:18134 |