Hibernateのトランザクションの同時実行悲観的ロック&&オプティミスティックロック

トランザクションの同時実行の問題

1.汚れたリード(ダーティリード):別のコミットされていないトランザクションへの読み取りトランザクション
2.非反復可能読み取り(非反復可能読み取り):同じ回線でのトランザクションデータを二回読み込まれますが、このデータは二度読まれていません同様に
二回のトランザクションのクエリが、最初のクエリよりも2番目のクエリは、データのより多くのまたはより少ない行または列があります読ん3.マジック(ファントムリード)

4つのトランザクション分離レベルがあります:
1 -読み取りコミット
2 -読むコミット
4 -反復可能読み取り
8-直列化
効率を考慮して一般的な分離方法の第2レベルを使用して問題を解決するために。しかし、それは非反復可能読み取りを解決することはできませんが、休止状態の種で楽観と悲観的ロックを解決するために使用することができます。

ペシミスティック・ロック

ペシミスティック・ロックは、現在のトランザクションが同時にロックリソースに乱され、現在のトランザクションの動作を避けるために、他のトランザクションによってアクセスされることを前提としています。
これは、ロックデータベースの使用です。負荷の種類の方法でLockMode.UPCRADE、後で追加するUPDATE文のDDLように設けられています。

@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();
	}

オプティミスティック・ロック

オプティミスティック・ロックは、他のトランザクションへのアクセスを再利用プログラムロジックが解決したときに、現在のトランザクションが同時にアクセスを他のことをしないだろうということを前提としています。
トランザクションの終了は、バージョン1のコントラスト値+ startの値とはないエラーとして、時間をコミットし、現在のトランザクションを加えたバージョンフィールド、。上記に@Versionバージョンのホストを追加するプロセスです。`

private int version;
	@Version
	public int getVersion() {
		return version;
	}

テスト

@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.getTransaction().commit();
		System.out.println(a1.getVersion());

		session2.getTransaction().commit();
		System.out.println(a2.getVersion());

		session.close();
		session2.close();
	}

結果はsession2.getTransaction()()コミットされます。障害が発生した場合。

发布了47 篇原创文章 · 获赞 5 · 访问量 2049

おすすめ

転載: blog.csdn.net/OVO_LQ_Start/article/details/104120344