MySQLの基本8 [TCL:データベース制御言語とトランザクション]

1.ビジネスの4つの特徴

トランザクション:
実行ユニットを形成する1つまたはグループのSQLステートメント。
この実行ユニットは、すべて実行されるか、まったく実行されないかのいずれかです。

 ケース転送
 張三丰1000
 郭襄1000

UPDATEテーブルSET張三丰の残高= 500 WHERE NAME = '张三丰'
UPDATEテーブルSET郭襄の残高= 1500 WHERE NAME = '郭襄'

事故が発生した場合、最初の事故は成功し、2番目の事故は失敗します。
その場合、ステートメントは信頼できません。

したがって、トランザクションのこれら2つのコンポーネントをすべて成功または失敗させて、信頼性を高め
ます。1回の実行が失敗すると、ユニット全体がロールバックします。
影響を受けるすべてのデータは、トランザクションが開始される前の状態に戻り
ますユニットが実行されます成功した場合、トランザクションはスムーズに実行されます

トランザクションのACID属性
1.原子性原子性
とは、トランザクションが分割できない作業単位であり、トランザクション内の操作がすべて発生するか、発生しないことを意味します。

2.整合性(整合性)
トランザクションは、データベースを整合性のある状態から別の整合性のある状態にする必要があります

たとえば、転送前の合計金額は2000であり、転送後の合計金額は2000ですが、これは依然として正確で信頼性があります。

3.分離(分離)
トランザクションの分離とは、トランザクションの実行が他のトランザクションによって妨害されないことを意味します。つまり、トランザクションによって
使用される内部操作とデータは他の同時トランザクションから分離され、同時に
実行される各トランザクションは分離できません。互いに干渉し合う。

分離レベルによって制御されます。

4.耐久性(耐久性)耐久性
とは、トランザクションがコミットされると、データベース内のデータへの変更が永続的であることを意味します。
その後の他の操作やデータベースの障害は、それに影響を与えるべきではありません。

トランザクション
を変更するために新しいトランザクションを追加しない限り、トランザクションを元に戻すことはできません

第二に、事務の使用

トランザクションの作成


暗黙的なトランザクション:トランザクションには
、insert UPDATEdeleteステートメントなどの明確な開始マークと終了マークがありません

'autocommit'のような変数を表示します。

デフォルトでオンになっています。

継続的に送信する場合は、明示的なトランザクションを使用する必要があります。
明示的なトランザクション:トランザクションには明らかな開始マークと終了マークがあります

前提条件:最初に自動送信機能を無効に設定する必要があります

トランザクションを開くためのステートメント:

UPDATEテーブルSET張三丰の残高= 500 WHERE NAME = '張三丰'

UPDATEテーブルSETGuoXiangの残高= 1500 WHERE NAME = 'Guo Xiang'

トランザクションを終了するステートメント:

SET autocommit = 0;

ステップ1:トランザクションを開始します
SET autocommit = 0; 
START TRANSACTION; #Optional

ステップ2:トランザクションにSQLステートメント(INSERT UPDATE deleteを選択)
ステートメント1
記述します;ステートメント2;
.. ..

ステップ3:トランザクションの
コミットを終了し
ます;トランザクションをコミットしますROLLBACK;トランザクションをロールバックします

USE test;
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
balance DOUBLE
);

INSERT INTO account(username,balance)
VALUES('张无忌',1000),('赵敏',1000);

SELECT * FROM account;

#开启事务
SET autocommit = 0;
START TRANSACTION;
#编写一组事务的语句
UPDATE account SET balance = 500 WHERE username = '张无忌';
UPDATE account SET balance = 1500 WHERE username = '赵敏';

#结束事务
#回滚
ROLLBACK;
COMMIT;

3つ目は、トランザクションの並行性です。

同時に実行される複数のトランザクションの場合、これらのトランザクションがデータベース内の同じデータにアクセスするときに、必要な分離メカニズムが採用されていないと、さまざまな同時実行の問題が発生します。

ダーティ読み取り:2つのトランザクションT1、T2、T1について、T2によって更新されたがまだコミットされていないフィールドを読み取ります。その後、T2がロールバックすると、T1によって読み取られたコンテンツは一時的で無効になります。

繰り返し不可の読み取り:2つのトランザクションT1、T2、T1がフィールドを読み取り、T2がフィールドを更新した後、T1が同じフィールドを再度読み取ると、値が異なります。

ファントム読み取り:2つのトランザクションT1、T2、T1がテーブルからフィールドを読み取り、T2がテーブルに新しい行を挿入します。その後、T1が同じテーブルを再度読み取ると、さらに数行になります。

 

第4に、トランザクションの分離レベル

データベーストランザクションの分離:データベースシステムには、さまざまなトランザクションを分離して同時に実行する機能が必要です。これにより、トランザクションが相互に影響を与えず、さまざまな同時実行の問題を回避できます。

トランザクションを他のトランザクションから分離する度合いは、分離レベルと呼ばれます。データベースはさまざまなトランザクション分離レベルを指定し、異なる分離レベルはさまざまな干渉レベルに対応します。分離レベルが高いほど、データの整合性は向上しますが、同時実行性が弱くなります。

ここに理解があります:

T2はコミットされていないT1を読み取り、T2は送信されたT1を読み取ります。

Mysqlは4つのトランザクション分離レベルをサポートしています。Mysqlのデフォルトのトランザクション分離レベルは次のとおりです。REPEATABLEREAD 

 

 

五、回滚点

ロールバックポイントは、セーブポイントとも呼ばれ、トランザクションをセーブポイントの後の最初のステートメントにロールバックさせることができます。
へのロールバックでのみ使用できます。

SET autocommit = 0;
START TRANSACTION;
DELETE FROM account WHERE id = 25;
SAVEPOINT a;#设置保存点
DELETE FROM account WHERE id = 29;

ROLLBACK TO a;#回滚到保存点,也就是保存点以后的可以回滚,保存点以前的无法回滚。

 

おすすめ

転載: blog.csdn.net/Kukeoo/article/details/114275155