JDBCは第3局のTransactionプログラミングを学ぶ
3607 ワード
1 1 トランザクションの4つの特性
トランザクションは、次の機能(ACID)を備えたワークユニットです.
(1) 原子間トランザクションの原子間トランザクションとは、トランザクションに含まれるプログラムがデータベースの論理作業単位としてデータに対して行われることを意味します.
変更操作はすべて実行するか、まったく実行しません.
原子操作、すなわち不可分な操作は、一緒に成功し、一緒に失敗しなければならない.
(2) コンシステンシトランザクションのコンシステンシとは、1つのトランザクションの実行前と実行後にデータベースがコンシステンシ状態である必要があることを意味します.これ
このプロパティは、トランザクションの一貫性と呼ばれます.データベースのステータスがすべての整合性制約を満たす場合、データベースは一貫性があります.
のです.
(3) 分離性分離性とは、同時トランザクションが互いに隔離されていることを意味します.つまり、トランザクション内の操作と操作中のデータはブラックアウトする必要があります.
起きて、他の修正を企てる事務に見られない.
(4) 永続性永続性とは、システムまたはメディアに障害が発生した場合に、コミットされたトランザクションの更新が失われないことを意味します.つまり
トランザクションがコミットされ、DBMSはデータベース内のデータの変更が永続的であり、システム障害に耐えられることを保証します.
永続性は、データベースのバックアップとリカバリによって保証されます.
2 トランザクション3ステップ
//完全なコードクリップ:
3 C JDBC トランザクションおよびトランザクションの独立性レベル
JDBC トランザクションの同時発生の問題:1 ダーティリード(D D irty R eads)あるトランザクションは、別のパラレルトランザクションがまだコミットされていないデータを読み込みます.
② 再読み込み不可(UnRe peatable Read)1つのトランザクションが前のデータを再読み込みした場合、得られるデータは異なる
はい、別のコミットされたトランザクションによって変更されます.
③ 幻読(Phantom Read)トランザクションはクエリーを再実行し、他の最も優れたレコードが含まれているため、返されます.
最近コミットされたトランザクションによって生成された新しいレコード.
以上の3つのケースを避けるために、
トランザクション独立性レベル:
TRANSACTION_NONEトランザクションを使用しない
TRANSACTION_READ_UNCOMMITTEDはコミットされていないデータを読み取ることができます
TRANSACTION_READ_COMMITTEDは汚れた読み取りを避けることができ、コミットされていないデータを読み取ることができず、最も一般的な独立性レベルの大部分のデータベースのデフォルトの独立性レベル
TRANSACTION_REPEATABLE_READは汚れた読み取りを避けることができ、繰り返し読み取りはできません
TRANSACTION_SERIALIZABLEはダーティリードを回避し、繰り返し読み取りや幻読みを行わないため、データベースの効率が低下します.
以上の5つのトランザクション独立性レベルは、Connectionクラスで定義された静的定数です.
setTransactionIsolation(int level)メソッドでは、トランザクション独立性レベルを設定できます.
例:
4トランザクション・インスタンス
まとめの悪いところがあれば、伝言を残して弟にも勉強させてください.
トランザクションは、次の機能(ACID)を備えたワークユニットです.
(1) 原子間トランザクションの原子間トランザクションとは、トランザクションに含まれるプログラムがデータベースの論理作業単位としてデータに対して行われることを意味します.
変更操作はすべて実行するか、まったく実行しません.
原子操作、すなわち不可分な操作は、一緒に成功し、一緒に失敗しなければならない.
(2) コンシステンシトランザクションのコンシステンシとは、1つのトランザクションの実行前と実行後にデータベースがコンシステンシ状態である必要があることを意味します.これ
このプロパティは、トランザクションの一貫性と呼ばれます.データベースのステータスがすべての整合性制約を満たす場合、データベースは一貫性があります.
のです.
(3) 分離性分離性とは、同時トランザクションが互いに隔離されていることを意味します.つまり、トランザクション内の操作と操作中のデータはブラックアウトする必要があります.
起きて、他の修正を企てる事務に見られない.
(4) 永続性永続性とは、システムまたはメディアに障害が発生した場合に、コミットされたトランザクションの更新が失われないことを意味します.つまり
トランザクションがコミットされ、DBMSはデータベース内のデータの変更が永続的であり、システム障害に耐えられることを保証します.
永続性は、データベースのバックアップとリカバリによって保証されます.
2 トランザクション3ステップ
connection.setAutoCommit(false); //
/*。。。。。。。*/ // DB
//
connection.commit() //
// SQL ,
connection.rollback() //
//完全なコードクリップ:
try {
con.setAutoCommit(false); //step ①
Statement stm = con.createStatement();
stm.executeUpdate("insert into person(id, name, age) values(520, 'X-Man', 18)");
stm.executeUpdate("insert into Person(id, name, age) values(521, 'Super', 19)");
//step ② DB
con.commit(); //step ③
} catch(SQLException e) {
try {
con.rollback();
} catch(Exception e) {
e.printStackTrace();
} //step ③
}
3 C JDBC トランザクションおよびトランザクションの独立性レベル
JDBC トランザクションの同時発生の問題:1 ダーティリード(D D irty R eads)あるトランザクションは、別のパラレルトランザクションがまだコミットされていないデータを読み込みます.
② 再読み込み不可(UnRe peatable Read)1つのトランザクションが前のデータを再読み込みした場合、得られるデータは異なる
はい、別のコミットされたトランザクションによって変更されます.
③ 幻読(Phantom Read)トランザクションはクエリーを再実行し、他の最も優れたレコードが含まれているため、返されます.
最近コミットされたトランザクションによって生成された新しいレコード.
以上の3つのケースを避けるために、
トランザクション独立性レベル:
TRANSACTION_NONEトランザクションを使用しない
TRANSACTION_READ_UNCOMMITTEDはコミットされていないデータを読み取ることができます
TRANSACTION_READ_COMMITTEDは汚れた読み取りを避けることができ、コミットされていないデータを読み取ることができず、最も一般的な独立性レベルの大部分のデータベースのデフォルトの独立性レベル
TRANSACTION_REPEATABLE_READは汚れた読み取りを避けることができ、繰り返し読み取りはできません
TRANSACTION_SERIALIZABLEはダーティリードを回避し、繰り返し読み取りや幻読みを行わないため、データベースの効率が低下します.
以上の5つのトランザクション独立性レベルは、Connectionクラスで定義された静的定数です.
setTransactionIsolation(int level)メソッドでは、トランザクション独立性レベルを設定できます.
例:
con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
4トランザクション・インスタンス
package JDBC_Study;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class TransactionDemo {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
//
Class.forName("com.mysql.jdbc.Driver");
//
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/jdbc_teaching", "root", "");
//
conn.setAutoCommit(false);
// SQL
String sql = "INSERT INTO user_list ( user_name, user_password )VALUES ( 'Eric', '123' )";
// SQL
stmt = conn.createStatement();
stmt.executeUpdate(sql);
//
conn.commit();
System.out.println("OK!");
} catch (Exception e) {
e.printStackTrace();
//
try {
conn.rollback();
} catch (Exception e2) {
}
} finally {
// Statement
try {
stmt.close();
} catch (Exception e) {
}
// Connection
try {
conn.close();
} catch (Exception e) {
}
}
}
}
まとめの悪いところがあれば、伝言を残して弟にも勉強させてください.