ヒベルナト悲観ロックと楽観ロックコードの紹介を実現します。
四つの隔離機構を忘れないでください。(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:
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
ii.Hibernate(JPA)楽観ロック(ReadComitted)
これはデータベースのロックに依存するものではなく、プログラムにロックをかけたものです。
例を挙げると、一つのデータは隔離機構が必要です。この時、更新されたフィールドにバージョン番号を付けます。誰かがudateを与えたら、この値は1を加算します。
このメカニズムはどうやって隔離能力を生み出すのですか?
このフィールドは、トランザクションAがフィールドを読み込むと同時に、トランザクションBがそのフィールドを読み出し、変更したため、versionが1になったからです。この時、事務Aはフィールドが変更されたかどうかを確認します。変更されたら、それに応じて変更します。
楽観ロックの実現:(@Version)
Acceount.java:
楽観的にロックして、事故がなければいいです。何かあったら解決したいです。
締め括りをつける
以上が、ヒベルナトの悲観ロックと楽観ロックコードの実現について紹介した内容のすべてです。何か問題があったらいつでもメッセージを残してください。みなさんの応援に感謝します。
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();
}
悲観的で楽観的な違い:悲観的なロックはきっと影響を受けると思って、私はロックをかけて誰も動かないでください。楽観的にロックして、事故がなければいいです。何かあったら解決したいです。
締め括りをつける
以上が、ヒベルナトの悲観ロックと楽観ロックコードの実現について紹介した内容のすべてです。何か問題があったらいつでもメッセージを残してください。みなさんの応援に感謝します。