環(huán)境:
悲觀鎖:
樂觀鎖:
????
private
?SessionFactory?sessionFactory;
???? protected ? void ?setUp()? throws ?Exception?{
???????? super .setUp();
???????? // 利用java反射得到?HibernateSessionFactory?->
???????? // private??static?org.hibernate.SessionFactory?sessionFactory;
???????? // 要模擬?并發(fā)?要?HibernateSessionFactory?得出的?有?threadLocal?不行?
???????? // 要?
????????HibernateSessionFactory.currentSession();
????????HibernateSessionFactory.closeSession();
????????Field?field? = ?HibernateSessionFactory. class .getDeclaredField( " sessionFactory " );
????????field.setAccessible( true );
????????sessionFactory? = ?(SessionFactory)?field.get(HibernateSessionFactory. class );
????}
???? protected ? void ?tearDown()? throws ?Exception?{
???????? super .tearDown();
????}
???? protected ? void ?setUp()? throws ?Exception?{
???????? super .setUp();
???????? // 利用java反射得到?HibernateSessionFactory?->
???????? // private??static?org.hibernate.SessionFactory?sessionFactory;
???????? // 要模擬?并發(fā)?要?HibernateSessionFactory?得出的?有?threadLocal?不行?
???????? // 要?
????????HibernateSessionFactory.currentSession();
????????HibernateSessionFactory.closeSession();
????????Field?field? = ?HibernateSessionFactory. class .getDeclaredField( " sessionFactory " );
????????field.setAccessible( true );
????????sessionFactory? = ?(SessionFactory)?field.get(HibernateSessionFactory. class );
????}
???? protected ? void ?tearDown()? throws ?Exception?{
???????? super .tearDown();
????}
悲觀鎖:
????
/**
?悲觀鎖問題?線程模擬?并發(fā)?
?????*?Table?->?T1oo(id,name)
?????*?????+----+------+
?????*????|?id?|?name?|
?????*????+----+------+
?????*????|??4?|?xx1??|
?????*????+----+------+
????? */
???? public ? void ?ctestLock()? throws ?Exception?{
???????? // ?insert?test?Data 測試數(shù)據(jù)
????????Session?seInsert? = ?sessionFactory.openSession();
????????Transaction?tr? = ?seInsert.beginTransaction();
????????T1oo?testUse? = ?testUse? = ? new ?T1oo();
????????testUse.setName( " liukaiyi_test " );
????????seInsert.save(testUse);
????????tr.commit();
????????System.out.println(? " **************Test?Use?Bean?:?insert******************* " ?);
????????seInsert.close();
????????Integer?testId? = ?testUse.getId();
????????
??????? //并發(fā)模擬
????????Session?session1? = ?sessionFactory.openSession();
????????Session?session2? = ?sessionFactory.openSession();
????????
???????? final ?Transaction?tr1? = ?session1.beginTransaction();
????????Transaction?tr2? = ?session2.beginTransaction();
????????
????????Query?qu1? = ?session1.createQuery( " ?from?T1oo?t1oo?where?t1oo.name='liukaiyi_test' " );
????????Query?qu2? = ?session2.createQuery( " ?from?T1oo?t1oo?where?t1oo.name='liukaiyi_test' " );
????????
??????? //加悲觀鎖
????????qu1.setLockMode( " t1oo " ,LockMode.UPGRADE);
???????? final ?Object?bean1? = ?qu1.uniqueResult();
????????Object?bean2? = ?qu2.uniqueResult();
????????T1oo?t1oo2? = ?(T1oo)bean2;
????????
????????t1oo2.setName( " run1 " );
????????
???????? new ?Thread(
???????????????? new ?Runnable(){
???????????????????? public ? void ?run()??{
???????????????????????? try ?{
????????????????????????????System.out.println(? " ********解鎖準(zhǔn)備********* " ?);
????????????????????????????Thread.sleep( 10 * 1000 );
????????????????????????????T1oo?t1oo1? = ?(T1oo)bean1;
????????????????????????????t1oo1.setName( " run2 " );
????????????????????????????tr1.commit();
????????????????????????????System.out.println(? " ********解鎖成功t********* " ?);
????????????????????????}? catch ?(InterruptedException?e)?{e.printStackTrace();}
????????????????????}
????????????????}
????????).start();
??????? / /這里會 等待十秒后 tr1解鎖 /
????????tr2.commit();
????????
????????session1.close();
????????session2.close();
????????
????????
???????? // ?delete?Test?Date 刪除測試數(shù)據(jù)
????????Session?seDelete? = ?sessionFactory.openSession();
????????Transaction?trD? = ?seDelete.beginTransaction();
????????Object?obj? = ?seDelete.createQuery( " ?from?T1oo?t?where?t.id=:id? " ).
????????????????????????setInteger( " id " ,testId.intValue()).
????????????????????????uniqueResult();
????????seDelete.delete(obj);
????????trD.commit();
????????System.out.println(? " **************Test?Use?Bean?:?delete************** " ?);
????????seDelete.close();
????}
?????*?Table?->?T1oo(id,name)
?????*?????+----+------+
?????*????|?id?|?name?|
?????*????+----+------+
?????*????|??4?|?xx1??|
?????*????+----+------+
????? */
???? public ? void ?ctestLock()? throws ?Exception?{
???????? // ?insert?test?Data 測試數(shù)據(jù)
????????Session?seInsert? = ?sessionFactory.openSession();
????????Transaction?tr? = ?seInsert.beginTransaction();
????????T1oo?testUse? = ?testUse? = ? new ?T1oo();
????????testUse.setName( " liukaiyi_test " );
????????seInsert.save(testUse);
????????tr.commit();
????????System.out.println(? " **************Test?Use?Bean?:?insert******************* " ?);
????????seInsert.close();
????????Integer?testId? = ?testUse.getId();
????????
??????? //并發(fā)模擬
????????Session?session1? = ?sessionFactory.openSession();
????????Session?session2? = ?sessionFactory.openSession();
????????
???????? final ?Transaction?tr1? = ?session1.beginTransaction();
????????Transaction?tr2? = ?session2.beginTransaction();
????????
????????Query?qu1? = ?session1.createQuery( " ?from?T1oo?t1oo?where?t1oo.name='liukaiyi_test' " );
????????Query?qu2? = ?session2.createQuery( " ?from?T1oo?t1oo?where?t1oo.name='liukaiyi_test' " );
????????
??????? //加悲觀鎖
????????qu1.setLockMode( " t1oo " ,LockMode.UPGRADE);
???????? final ?Object?bean1? = ?qu1.uniqueResult();
????????Object?bean2? = ?qu2.uniqueResult();
????????T1oo?t1oo2? = ?(T1oo)bean2;
????????
????????t1oo2.setName( " run1 " );
????????
???????? new ?Thread(
???????????????? new ?Runnable(){
???????????????????? public ? void ?run()??{
???????????????????????? try ?{
????????????????????????????System.out.println(? " ********解鎖準(zhǔn)備********* " ?);
????????????????????????????Thread.sleep( 10 * 1000 );
????????????????????????????T1oo?t1oo1? = ?(T1oo)bean1;
????????????????????????????t1oo1.setName( " run2 " );
????????????????????????????tr1.commit();
????????????????????????????System.out.println(? " ********解鎖成功t********* " ?);
????????????????????????}? catch ?(InterruptedException?e)?{e.printStackTrace();}
????????????????????}
????????????????}
????????).start();
??????? / /這里會 等待十秒后 tr1解鎖 /
????????tr2.commit();
????????
????????session1.close();
????????session2.close();
????????
????????
???????? // ?delete?Test?Date 刪除測試數(shù)據(jù)
????????Session?seDelete? = ?sessionFactory.openSession();
????????Transaction?trD? = ?seDelete.beginTransaction();
????????Object?obj? = ?seDelete.createQuery( " ?from?T1oo?t?where?t.id=:id? " ).
????????????????????????setInteger( " id " ,testId.intValue()).
????????????????????????uniqueResult();
????????seDelete.delete(obj);
????????trD.commit();
????????System.out.println(? " **************Test?Use?Bean?:?delete************** " ?);
????????seDelete.close();
????}
樂觀鎖:
????
/**
?樂觀鎖問題
?????*?Table?->?T1oo(id,name)
?????*?T2oo.hbn.xml?<class>?+>?optimistic-lock="version"
?????*?id下面?+>?<version?name="version"?type="integer"?column="version"?/>
?????*????+---------+---------+------+
?????*????|?Field???|?Type????|?Null?|
?????*????+---------+---------+------+
?????*????|?id??????|?int(11)?|??????|
?????*????|?avg?????|?int(11)?|??????|
?????*????|?aid?????|?int(11)?|?YES??|
?????*????|?version?|?int(11)?|?YES??|
?????*????+---------+---------+------+
?????*??注意:要在數(shù)據(jù)庫中多加一列?
?????*??mysql>?alter?table?T2OO?add?version?int;
????? */
???? public ? void ?testOpLock() throws ?Exception{
??????? //添加測試數(shù)據(jù)
????????Session?session? = ?sessionFactory.openSession();
????????Transaction?trI? = ?session.beginTransaction();
????????Connection?conn? = ?session.connection();
????????T2oo?t2oo? = ? new ?T2oo();
????????T1oo?t1oo? = new ?T1oo( " t1ooOpLock " );
????????t1oo.setT2ooSet( new ?HashSet());
????????t2oo.setAvg( new ?Integer( 23 ));????
????????t2oo.setT1oo(t1oo);
????????t1oo.getT2ooSet().add(t2oo);
????????session.save(t2oo);
????????trI.commit();
????????session.clear();
????????session.close();
??????? //并發(fā)模擬
????????Session?se1? = ?sessionFactory.openSession();
????????Session?se2? = ?sessionFactory.openSession();
????????
????????Transaction?tr1? = ?se1.beginTransaction();
????????Transaction?tr2? = ?se2.beginTransaction();
???????
????????T1oo?obj1? = ?(T1oo)se1.load(T1oo. class , new ?Integer( 1 ));
????????T1oo?obj2? = ?(T1oo)se2.load(T1oo. class , new ?Integer( 1 ));
????????
????????((T2oo)obj1.getT2ooSet().iterator().next()).setAvg( new ?Integer( 9 ));
????????((T2oo)obj2.getT2ooSet().iterator().next()).setAvg( new ?Integer( 10 ));
????????????????
????????tr1.commit();
????????
???????? try ?{
????????????tr2.commit();
????????}? catch ?(Exception?e)?{
????????????se2.clear();
????????????tr2.commit();
???????????? // tr2報錯
????????} finally {
????????????se1.close();
????????????se2.close();
????????}
????????
????????
??????? //測試數(shù)據(jù)刪除
????????Session?dele? = ?sessionFactory.openSession();
????????Transaction?tr? = ?dele.beginTransaction();
????????dele.delete(obj1);
????????tr.commit();
????????dele.close();
????????
????????HibernateSessionFactory.closeSession();
????}
?????*?Table?->?T1oo(id,name)
?????*?T2oo.hbn.xml?<class>?+>?optimistic-lock="version"
?????*?id下面?+>?<version?name="version"?type="integer"?column="version"?/>
?????*????+---------+---------+------+
?????*????|?Field???|?Type????|?Null?|
?????*????+---------+---------+------+
?????*????|?id??????|?int(11)?|??????|
?????*????|?avg?????|?int(11)?|??????|
?????*????|?aid?????|?int(11)?|?YES??|
?????*????|?version?|?int(11)?|?YES??|
?????*????+---------+---------+------+
?????*??注意:要在數(shù)據(jù)庫中多加一列?
?????*??mysql>?alter?table?T2OO?add?version?int;
????? */
???? public ? void ?testOpLock() throws ?Exception{
??????? //添加測試數(shù)據(jù)
????????Session?session? = ?sessionFactory.openSession();
????????Transaction?trI? = ?session.beginTransaction();
????????Connection?conn? = ?session.connection();
????????T2oo?t2oo? = ? new ?T2oo();
????????T1oo?t1oo? = new ?T1oo( " t1ooOpLock " );
????????t1oo.setT2ooSet( new ?HashSet());
????????t2oo.setAvg( new ?Integer( 23 ));????
????????t2oo.setT1oo(t1oo);
????????t1oo.getT2ooSet().add(t2oo);
????????session.save(t2oo);
????????trI.commit();
????????session.clear();
????????session.close();
??????? //并發(fā)模擬
????????Session?se1? = ?sessionFactory.openSession();
????????Session?se2? = ?sessionFactory.openSession();
????????
????????Transaction?tr1? = ?se1.beginTransaction();
????????Transaction?tr2? = ?se2.beginTransaction();
???????
????????T1oo?obj1? = ?(T1oo)se1.load(T1oo. class , new ?Integer( 1 ));
????????T1oo?obj2? = ?(T1oo)se2.load(T1oo. class , new ?Integer( 1 ));
????????
????????((T2oo)obj1.getT2ooSet().iterator().next()).setAvg( new ?Integer( 9 ));
????????((T2oo)obj2.getT2ooSet().iterator().next()).setAvg( new ?Integer( 10 ));
????????????????
????????tr1.commit();
????????
???????? try ?{
????????????tr2.commit();
????????}? catch ?(Exception?e)?{
????????????se2.clear();
????????????tr2.commit();
???????????? // tr2報錯
????????} finally {
????????????se1.close();
????????????se2.close();
????????}
????????
????????
??????? //測試數(shù)據(jù)刪除
????????Session?dele? = ?sessionFactory.openSession();
????????Transaction?tr? = ?dele.beginTransaction();
????????dele.delete(obj1);
????????tr.commit();
????????dele.close();
????????
????????HibernateSessionFactory.closeSession();
????}