記事ディレクトリ
序文
トランザクション要件で複数の DML 操作の使用が必要な場合、ビジネスは全体として処理されます。処理中に障害または例外が発生した場合。ビジネスを始めた初期の状態に戻る必要があります。処理が成功すると、データがディスクに保存されます。このようなプロセスがトランザクションです。トランザクションはアトミックで、一貫性があり、分離されており、耐久性があります。
簡単に言うと、トランザクションとは論理的な一連の操作を指し、この一連の操作を構成する各ユニットは、実行中にすべて成功するかすべて失敗します。
キーワードを使用します: commit、rollback、savepoint
1. トランザクションの特徴(ACID)
- 原子性とは
、トランザクションが分割不可能な全体であり、すべてのトランザクション操作が発生するか、まったく発生しないかのどちらかであることを意味します。 - 整合性トランザクションは、
データベースをある整合性状態から別の整合性状態に移行する必要があります。たとえば、合計金額は転送の前後で変わりません。 - 分離:トランザクションの分離
とは、複数のユーザーが同時にデータベースにアクセスする場合、各ユーザーに対してデータベースによって開かれたトランザクションが他のトランザクションの操作データによって干渉されないこと、および複数の同時トランザクションが互いに分離されている必要があることを意味します。 - 持続性(Durability)
トランザクションがコミットされると、データベース内のデータに対する変更は永続的となり、データベースに障害が発生した場合でも、そのデータに影響を与える。
2. MySQL トランザクション
デフォルトでは、MySQL によって実行されるすべての SQL ステートメントは別個のトランザクションになります。トランザクションに複数の SQL ステートメントを含める必要がある場合は、トランザクションを開始してトランザクションを終了する必要があります。
-- 开启事务:
start transaction;
-- 结束事务:
commit
rollback;
トランザクション開始状況
- データベースに接続し、DML ステートメントの挿入、更新、または削除を実行します。
- 前のトランザクションが終了した後、別の DML ステートメントが入力されました。
取引の終了
- コミットまたはロールバックステートメントを実行する
- create table ステートメントなどの DDL ステートメントを実行すると、commit ステートメントが自動的に実行されます。
- create table ステートメントなどの DDL ステートメントを実行すると、commit ステートメントが自動的に実行されます。
- データベースから切断する
- DML ステートメントが実行され、ステートメントが失敗した場合、無効な DML ステートメントに対してロールバック ステートメントが実行されます。
1. 例: トランザクションサポートを実装する SQL ステートメント
ロールバック
START TRANSACTION;
UPDATE account SET balance=balance-10000 WHERE id=1;
SELECT * FROM account; UPDATE account SET balance=balance+10000 WHERE id=2;
ROLLBACK;
提出する
START TRANSACTION;
UPDATE account SET balance=balance-10000 WHERE id=1;
SELECT * FROM account;
UPDATE account SET balance=balance+10000 WHERE id=2;
COMMIT;
3. 複数の事情がある場合
1. 汚い読書
トランザクション A はトランザクション B によって更新されたばかりのデータを読み取りますが、トランザクション B はロールバックします。これにより、トランザクション A によって読み取られたデータはダーティ データ (ダーティ リード) になります。
2. 繰り返し不可能な読み取り
トランザクション A は同じデータを 2 回読み取りますが、トランザクション B は 2 回の間にレコードを変更してコミットするため、トランザクション A によって読み取られたデータに不整合が生じます。
ダーティ リードとの違いは、ダーティ リードはトランザクション A がトランザクション B のコミットされていないダーティ データを読み取ることであることです。非反復読み取りとは、トランザクション A がトランザクション B によって送信されたデータを読み取ることを意味します。
3.ファントムリーディング
トランザクション A がデータのクエリを完了した後、トランザクション B は新しいデータを追加する操作を実行します。トランザクション A が再度データをクエリすると、理由もなく新しいレコードが追加されていることがわかります。これがファントムリーディングです。
4. ファントム読み取りとノンリピート読み取りの比較
同じことです。それらはすべて、別のコミットされたトランザクション用です。
違い: 反復不可能な読み取りは通常同じレコードを対象としますが、ファントム読み取りは複数のレコードを対象とします。非反復読み取りは更新と削除に重点を置き、ファントム読み取りは挿入に重点を置きます。
概要: データベースはトランザクションの分離レベルを設定することで、上記の状況の発生を防ぎます。
4. 絶縁機構
1. 隔離機構の分類
- コミットされていない読み取り
- コミットされた読み取り
- 反復可能な読み取り
- シリアル化可能_
1.1.1 コミットされていない読み取り
分離制御を行わないと、「ダーティデータ」が読み取られる可能性があります。反復不可能な読み取りが発生したり、ファントム読み取りが発生したりする可能性があります。
1.1.2 提出の程度
トランザクション内のコミットされていないデータの読み取りは許可されません。ダーティ リードの問題は回避できますが、反復不可能な読み取りやファントム リードが発生する可能性があります。この分離レベルは、ほとんどのデータベース ( MySQL を除く)のデフォルトの分離レベルです。
1.1.3 繰り返し可能な読み取り
コミット読み取りレベルでの反復不能読み取りの問題を回避するため。トランザクション内の条件を満たすレコードを「排他ロック」することで、トランザクションが操作するデータを他のトランザクションが変更できないようにすることで、反復不可能な読み取りの問題を回避できます。操作データのみがロックされるため、他のトランザクションがデータを挿入または削除すると、ファントム リードが発生します。この分離レベルは、MySQL のデフォルトの分離レベルです。
1.1.4 シリアル化
トランザクション中にテーブルをロックして、トランザクションが終了する前に他のトランザクションがテーブル データに対して操作 (追加、削除、変更) できないようにします。これにより、ダーティ リード、反復不可能な読み取り、ファントム リードが回避され、最も安全な分離になります。レベル。ただし、この操作はブロックされるため、パフォーマンスに重大な影響を与えます。
注意点:
- 分離メカニズムのレベルが高くなるほど、データの安全性は高まりますが、パフォーマンスは低下します。
- 分離レベルの設定はトランザクションの前に行う必要があります
2.mysqlでの分離レベル関連の操作
現在のトランザクション分離レベルを表示します: SELECT @@TX_ISOLATION
現在のトランザクション分離レベルを変更します。 SET TRANSACTION ISOLATION LEVEL 4 つのレベルのいずれか。
3.JDBC はトランザクションの分離レベルを制御します
接続インターフェース:
TRANSACTION_READ_UNCOMMITTED: ダーティ読み取り、非反復読み取り、ファントム読み取りの発生を許可する定数
TRANSACTION_READ_COMMITTED: ダーティ読み取りを防ぐための定数。反復不可能な読み取りとファントム読み取りが発生する可能性があります。
TRANSACTION_REPEATABLE_READ: ダーティ リードと非反復読み取りを防ぐための定数。ファントム リードが発生する可能性があります。
TRANSACTION_SERIALIZABLE: ダーティ読み取り、反復不能読み取り、ファントム読み取りの発生を防ぐための定数
設定方法:
Connection.setTransactionIsolation(int レベル);