ヒベルナト悲観ロックと楽観ロックコードの紹介を実現します。


四つの隔離機構を忘れないでください。(1,2,4,8)
1.read-uncomitted:提出されていないデータを読むことができます。
2.read-comitted:汚い読書はありません。他の事務に提出してこそ結果を読み取ることができますが、繰り返して読んではいけないという現象があります。
4.repeable read:MySQLデフォルト。繰り返して読んで、データを読んでからロックをかけてください。他の人は更新しないでください。使い切ったらまた更新してください。あなたの仕事が終わらない限り、他の仕事はこの記録を変えることができません。
8.serializable:シーケンス化、最高レベル。一つずつ来て、合併に行きません。効率が一番低いです。
ヒベルナの隔離メカニズム
i.hibernation.co nnections.isolation=2
ii.悲観ロックで解決:repeable readの問題(データベースのロックに依存)
a)LockMode.Noneのロックがない仕組みで、Transactionが終了したら、このモードに切り替えます。
b)LockMode.readは、お問い合わせの際、hibernateは自動的にロックを取得します。
c)LockMode.write insert udate hibernateは自動的にロックを取得します。
d)以上3の中でロックするモードは、ヒベルナツ内部で使用されます。
e)LockMode.UPGRADE_NOWAIT ORACLEがサポートするロックの方式
例:
Acceount.java:

package com.bjsxt.hibernate; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
@Entity 
public class Account { 
private int id; 
private int balance; //BigDecimal 
@Id 
@GeneratedValue 
public int getId() { 
return id; 
} 
public void setId(int id) { 
this.id = id; 
} 
public int getBalance() { 
return balance; 
} 
public void setBalance(int balance) { 
this.balance = balance; 
} 
} 
hibernature.cfg.xmlでの設定:

<mapping class="com.bjsxt.hibernate.Account"/> 
テスト:

@Test 
public void testSave() { 
Session session = sf.openSession(); 
session.beginTransaction(); 
Account a = new Account(); 
a.setBalance(100); 
session.save(a); 
session.getTransaction().commit(); 
session.close(); 
} 
@Test 
public void testOperation1() { 
Session session = sf.openSession(); 
session.beginTransaction(); 
Account a = (Account)session.load(Account.class, 1); 
int balance = a.getBalance(); 
//do some caculations 
balance = balance - 10; 
//                       
//       " "          
a.setBalance(balance); 
session.getTransaction().commit(); 
session.close(); 
} 
//                  
@Test 
public void testPessimisticLock() { 
Session session = sf.openSession(); 
session.beginTransaction(); 
//     ,             
Account a = (Account)session.load(Account.class, 1, LockMode.UPGRADE); 
int balance = a.getBalance(); 
//do some caculation 
balance = balance - 10; 
a.setBalance(balance); 
session.getTransaction().commit(); 
session.close(); 
} 
これはデータベースのロックに依存しています。つまり、データベースにロックをかけるように指示します。
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
ii.Hibernate(JPA)楽観ロック(ReadComitted)
これはデータベースのロックに依存するものではなく、プログラムにロックをかけたものです。
例を挙げると、一つのデータは隔離機構が必要です。この時、更新されたフィールドにバージョン番号を付けます。誰かがudateを与えたら、この値は1を加算します。
このメカニズムはどうやって隔離能力を生み出すのですか?
このフィールドは、トランザクションAがフィールドを読み込むと同時に、トランザクションBがそのフィールドを読み出し、変更したため、versionが1になったからです。この時、事務Aはフィールドが変更されたかどうかを確認します。変更されたら、それに応じて変更します。
楽観ロックの実現:(@Version)
Acceount.java:

package com.bjsxt.hibernate;  
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Version;  
@Entity 
public class Account { 
private int id; 
private int balance; 
private int version;  
@Version//                       
public int getVersion() { 
return version; 
} 
public void setVersion(int version) { 
this.version = version; 
} 
@Id 
@GeneratedValue 
public int getId() { 
return id; 
} 
public void setId(int id) { 
this.id = id; 
} 
public int getBalance() { 
return balance; 
} 
public void setBalance(int balance) { 
this.balance = balance; 
} 
} 
テスト:

 @Test 
public void testSave() { 
Session session = sf.openSession(); 
session.beginTransaction(); 
Account a = new Account(); 
a.setBalance(100); 
session.save(a); 
session.getTransaction().commit(); 
session.close(); 
} 
@Test 
public void testOptimisticLock() { 
Session session = sf.openSession(); 
Session session2 = sf.openSession(); 
session.beginTransaction(); 
Account a1 = (Account) session.load(Account.class, 1); 
session2.beginTransaction(); 
Account a2 = (Account) session2.load(Account.class, 1); 
a1.setBalance(900); 
a2.setBalance(1100); 
//   session    ,version  +1 
session.getTransaction().commit(); 
System.out.println(a1.getVersion()); 
//   session     ,  version        
//        ,     (        ) 
        session2.getTransaction().commit(); 
System.out.println(a2.getVersion()); 
session.close(); 
session2.close(); 
} 
悲観的で楽観的な違い:悲観的なロックはきっと影響を受けると思って、私はロックをかけて誰も動かないでください。
楽観的にロックして、事故がなければいいです。何かあったら解決したいです。
締め括りをつける
以上が、ヒベルナトの悲観ロックと楽観ロックコードの実現について紹介した内容のすべてです。何か問題があったらいつでもメッセージを残してください。みなさんの応援に感謝します。