データベース事務の解読


今晩私達は事務について話します。事務はデータベースの四つの特性を保証する前提です。
ビジネスのデモンストレーションを容易にするために、accountアカウントシートを作成する必要があります。
<span style="font-family:SimSun;">CREATE TABLE account(
	id NUMBER PRIMARY KEY,
	NAME VARCHAR(30),
	balance NUMBER (10,2)
);

INSERT INTO account VALUES(1,'zs', 100000);
INSERT INTO account VALUES(2,'ls', 100000);
INSERT INTO account VALUES(3,'ww', 100000);

SELECT * FROM account;</span>
1、事務は何ですか?
ここで簡単で分かりやすい例を挙げましょう。
銀行振り込み!張三は10000元を李四の口座に回します。これは実は二つのSQL文が必要です。
第一条SQL文:張三の口座に10000元を差し引く。
第二条SQL文:李四の口座に10000元を追加します。
第一条SQL文の実行が成功した後、第二条SQL文を実行する前に、プログラムが中断された場合(ある異常を投げたかもしれません。他の原因もあります。)、李四のアカウントは10000元を追加していません。張三は10000元を引いています。これはきっとだめです。
今はもう何が事務か分かりましたか?事務の中の複数の操作は、完全に成功するか、または完全に失敗するか!成功の半分はありえない!つまり張三の口座から10000元を引いて成功すれば、李四の口座に10000元の操作を加えても成功しなければなりません。さもなくば張三に10000元を差し引きます。李四に10000元を足すのは失敗です。
2、事務の四大特性(ACID)
事務の四つの特徴は:
 原子性(Atomicity):事務におけるすべての操作は、再分割できない原子単位である。すべての操作はすべて実行に成功するか、あるいはすべて実行に失敗します。
 整合性(Conssistency):事務実行後、データベースの状態は他の業務規則と一致しています。振替業務の場合、業務の実行が成功するかどうかに関わらず、振替に参加した二つのアカウントの残高の合計は変わらないはずです。
 隔離性(Isolation):分離性とは、同時動作において、異なる事務間を隔離し、各同時進行中の事務が相互に干渉しないようにすることをいう。
 耐久性(Durability):いったん事務の提出が成功すれば、事務中のすべてのデータ操作はデータベースに持続化されなければなりません。事務を提出した後、データベースがすぐに崩壊しても、データベースが再起動される時、何らかの仕組みでデータを回復することが保証されます。
これは面接の時によく聞かれますので、面接の質問に対処するためにはこの4つの特性を知る必要があります。
3、JDBC事務
jdbcの中で事務を処理して、すべてConnectionを通じて(通って)完成したのです!
同じ事務中のすべての操作は、同じConnectionオブジェクトを使用しなければなりません。
1、JDBCにおける事務
Connectionの3つの方法は、事務と関連があります。
1、setAutoCommt(bolean):自動的に事務を提出するかどうかを設定し、true(デフォルト値はtrue)が自動的に提出するということ、つまり各SQL文は単独の事務であり、falseを設定すれば、ビジネスが開始されるということになります。con.setAutoCommt(false)はビジネスを開始するという意味です!!
2、comit():提出完了事務;con.co mmit()提出する
3、ロックバック():ロールバックして事務を終了します。con.rollback()ロールバック
 
jdbc処理事務のコードフォーマット:
try{
  con.setAutoCommt(false);/ビジネスを開く…
  ….
  …
  con.co mmit()//tryの最終提出事務
}catch(){
  con.rollback()//ロールバック事務
)
次に私達はjavaの例を書きます。
<span style="font-family:SimSun;">/**
	 *     
	 * @param from     
	 * @param to	     
	 * @param money     
	 */
	public void transferAcc(String from, String to, double money) {
		//           Connection  !
		Connection con = null;
		try {
			con = JdbcUtils.getConnection();
			//    
			con.setAutoCommit(false);
			AccountDao dao = new AccountDao();
			int i = dao.updateBalance(con, from, -money);// from      
			if(i>0){
				System.out.println("      .         !");
				throw new RuntimeException("    ,  !          ");
			}

			int ii = dao.updateBalance(con, to, money);// to      
			if(ii>0){
				System.out.println("      ");
			}
			//    
			con.commit();
			con.close();
		} catch(Exception e) {
			//    
			try {
				con.rollback();
				con.close();
			} catch (SQLException e1) {
			}
			throw new RuntimeException(e);
		}
	}			</span>
その中のJdbcUtilsは私のdaoツールです。本文の肥大を避けるために、後で他のブログでこのタイプを書きます。
私たちは自分でクラスを書いて、この例を呼び出して事務をテストしてもいいです。簡単に言うと、一つのsqlが成功しないと、事務がロールバックします。
4、事務隔離レベル
 1、事務問題を併発する発生
物事の隔離レベルを理解するには、まず事務の併発による問題を理解しなければならない。なぜ隔離が必要なのか、合併による問題は大体5種類あり、そのうちの2つは更新問題、3つは読解問題である。
1、汚い読み(dirty read):他の事務に読んだ未提出の更新データは汚いデータを読みました。
2、重複して読んではいけません。同じ記録に対して二回の読み取りが不一致です。他の事務がこの記録に対して修正しました。
3、幻読み(虚読み)(phantom read):同じ表の二回の照会に対して不一致で、別の事務のために一つの記録を挿入した;
これらの三つの問題が発生した場面を簡単に紹介します。
きたなく読む
事務1:張三は李四に100元を振り込みます。
事務2:李四は自分の口座を調べます。
 t 1:事務1:事務を開始する
 t 2:事務1:張三は李四に100元を振り込む。
 t 3:事務2:事務開始
 t 4:事務2:李四は自分の口座を調べて、口座が100元以上あるのを見ました。(汚い読み)
 t 5:事務2:事務の提出
 t 6:事務1:ロールバック業務は、振替前の状態に戻ります。
繰り返して読んではいけません
事務1:ホテルで1048号室の状態を2回確認します。
事務2:1048号室を予約します。
 t 1:事務1:事務を開始する
 t 2:事務1:1048号室の空き状態を確認する。
 t 3:事務2:事務開始
 t 4:事務2:1048号室を予約します。
 t 5:事務2:事務の提出
 t 6:事務1:1048号の部屋の状態を再確認して使用する。
 t 7:事務1:提出事務
同じ記録の二回の検索結果が一致しません。
幻読み
事務1:ホテルの部屋の予約記録に対して2回の統計を取ります。
事務2:部屋の予約記録を追加する
 t 1:事務1:事務を開始する
 t 2:事務1:統計予約記録100条
 t 3:事務2:事務開始
 t 4:事務2:予約部屋記録を追加する
 t 5:事務2:事務の提出
 t 6:事務1:再統計予約記録101記録
 t 7:事務1:提出
同じ表の二回の検索は一致しません。
 
繰り返して読んではいけないと幻読みの違い:
 1、重複して読んではいけないのは、別の事柄の更新を読み取ったことである。
 2、幻読みは別の事柄を読み取った挿入(MySQLでは幻読みをテストできない)である。
 このようなことが起こらないように隔離レベルがあります。
 2、四大隔離レベル
4段階の事務分離レベルは、同じデータ環境で同じ入力を使って同じ作業を行い、異なる隔離レベルによって異なる結果をもたらすことができます。事務レベルによって解決できるデータの併発問題の能力は違います。
SERIALIZABLE
 同じデータに対するアクセスはシリアルであり、非同時アクセスであり、最悪の性能を持つため、同時に発生することはありません。
REPEATABLE READ(リピート可能)(MySQL)
  汚れ防止と読み返し不可、幻読問題の処理ができません。SERIALIZABLEより性能がいいです。
READ COMMITTED(提出済みデータ読み)(Oracle)
  汚れを防ぐためには、繰り返して読んではいけません。幻読みも処理していません。REPEATABLE READより性能がいいです。
READ UNCOMMITTED(未提出データ読み)
  何もしません任意の問題が同時に発生する可能性があります。
 
MySQLのデフォルトの分離レベルはREPEATABLE READです。
Oracleのデフォルトの分離レベルはREAD COMMITTEDです。
3、どのようにJDBCで隔離レベルを設定しますか?
con.set Transation Isolation(int level)
パラメータオプションの値は以下の通りです。
 Connection.TRANSACTION_READ_UNCOMMITTED;
 Connection.TRANSACTION_READ_COMMITTED;
 Connection.TRANSACTION_REPEATABLE_READ;
 Connection.TRANSACTION_SERIALIZABLE
 
事務総括:
 1、事務の特性:ACID;
 2、事務開始境界と終了境界:開始境界(con.set AutoCommt)、終了境界(con.co mmit()またはcon.rollback();
 3、事務の分離レベル:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。複数の事務を同時に実行する場合は、併発事務を考慮する必要があります。