七つのトランザクション制御

簡単な紹介

説明

トランザクション制御言語トランザクション制御言語

業務

別個のユニットまたはSQL文からなるユニットのグループ、またはすべての実行ユニットによって実行されるトランザクションが実行またはすべて実行しません。

広げます

ストレージエンジンでのMysql

  • ファイル(メモリ)に記憶されている様々な技術を使用してMySQLのデータで
  • ショーエンジンによって、MySQLのストレージエンジンのサポートを表示するコマンド
  • InnoDBは、MyISAMテーブル、メモリなど:ほとんどで使用されるMySQLのストレージエンジンで。これはInnoDBのサポートサービスを、とMyISAMテーブル、メモリなどのトランザクションをサポートしていません。

    削除し、使用してトランザクションを切り捨てるの違い

  • トランザクションのロールバックのサポートを削除
  • トランザクションのロールバックをサポートしていません切り捨てます

    ACIDトランザクション()プロパティ

    ###アトミック(不可分)
    原子性は、トランザクションがいずれかのトランザクションに作業操作の不可分単位で発生し又は発生しないことを意味します

    一貫性(一貫性)

    トランザクションは、別の一貫した状態にある一貫した状態からデータベースを変換する必要があります

    絶縁(アイソレーション)

    分離は、トランザクションが他の同時トランザクションが分離されているトランザクション内の他のトランザクションの干渉、すなわち、操作及びデータを用いて行うことができないトランザクションであると同時に実行される各トランザクションの間に互いに干渉しないことを意味します。

    永続性(耐久性)

    持続性は、一度トランザクションがコミットされることを意味し、それはデータベース内のデータを変更恒久的で、その後、他の操作やデータベースの障害は、その上の任意の影響を与えるべきではありません

    ケース

    転送:

    MA:千元
    MA:千元
    転送500 Maの、以下の単純なSQL:
    テーブルを更新バランス= 500ここで、NAME =「MA」を設定、
    更新テーブルセットバランス= 1500 NAME =「MA」。
    トランザクションが制御されていない場合は、上記の2つのSQL場合、ケース500馬のバランスは、リンクされたデータベースの下で低下、お金が500馬、馬または1000となります。

トランザクションの作成

暗黙的なトランザクション

入門

トランザクションは、オンとオフを明らかにされていません。

以下のような:挿入、更新、削除

変数を見て、コマンドを実行します。

show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+

自動コミット、表示するには、これは目に見えない取引役に立たない、文は、トランザクションがデフォルトで有効になっている場合、操作は、SQL(複数のSQL)のセットである場合、削除、変更を追加する場合で、オンになっています。

明示的なトランザクション

入門

トランザクションは明白オープニングタグと終了タグを持ち、明示的なトランザクションを使用して、自動コミットをオフにする必要があり、その後の前提

閉じる自動コミット

mysql> set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+

文法

ステップ1:総務を回し

設定された自動コミット= 0。

トランザクションを開始;#オプション

ステップ2:SQL文の事務を書きます

ステートメント1;

ステートメント2;

.............

ステップ3:エンドトランザクション

コミット、トランザクションをコミット

ロールバック、ロールバックトランザクション

ショー

トランザクションをコミットします。

set autocommit = 0;
start transaction;
update user_info set `password` = 'qqqqqqq' where id = 1;
update user_info set `password` = 'wwwwwww' where id = 2;
commit;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_info where id in (1,2);
+----+-----------+----------+--------+---------------------+---------------------+
| id | user_name | password | status | create_time         | update_time         |
+----+-----------+----------+--------+---------------------+---------------------+
|  1 | liuyang   | qqqqqqq  |      1 | 2019-09-07 14:38:47 | 2019-09-07 14:38:47 |
|  2 | zhangsan  | wwwwwww  |      1 | 2019-09-07 14:38:47 | 2019-09-07 14:38:47 |
+----+-----------+----------+--------+---------------------+---------------------+
2 rows in set (0.06 sec)

トランザクションをロールバックします。

set autocommit = 0;
start transaction;
update user_info set `password` = 'xxxxxxx' where id = 1;
update user_info set `password` = 'aaaaaaa' where id = 2;
rollback;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_info where id in (1,2);
+----+-----------+----------+--------+---------------------+---------------------+
| id | user_name | password | status | create_time         | update_time         |
+----+-----------+----------+--------+---------------------+---------------------+
|  1 | liuyang   | qqqqqqq  |      1 | 2019-09-07 14:38:47 | 2019-09-07 14:38:47 |
|  2 | zhangsan  | wwwwwww  |      1 | 2019-09-07 14:38:47 | 2019-09-07 14:38:47 |
+----+-----------+----------+--------+---------------------+---------------------+
2 rows in set (0.08 sec)

トランザクションが開いている場合は、コマンドが成功すると、変更は、上記から分かるように、結果は、ディスクの永続性に書き込まれるメモリに格納され、コミット後にのみされます。

複数のトランザクションを実行します

必要な分離メカニズムを取られていない場合は、これらの取引では、同じデータがデータベースにアクセスするための複数のトランザクションを実行するには、それは、並行性の問題のすべての種類につながることができます:

ダーティ読み取り: T2は、T1は、コンテンツは一時的かつ無効で読み込む場合は2件の取引のT1、T2について、T1は、フィールドはT2を更新されているが、まだロールバックした後に提出されていません読み込みます。

非反復可能読み取り:同じフィールドを読み取る2つのトランザクションT1、T2のため、T1が更新T2後フィールドを読み、フィールド、T1が再び、値が異なることになります

マジック読書: 2のトランザクションT1の間、T2、T1は、テーブルのフィールドから読み込まれ、その後、同じテーブルT1が再度読み込まれた場合、その後、テーブルに新しいT2の行を挿入し、いくつかは、よりになります行

データベーストランザクションの分離:データベースシステムは、個々のトランザクションを同時に実行単離する能力を持っている必要がありますので、彼らは、お互いに影響を与える同時実行の問題のすべての種類を避けることはありません。

トランザクションの程度は、他のトランザクションから分離されている分離レベルと呼ばれる:データの整合性が良好で、高い分離レベル、干渉の異なる程度に対応するデータベースのトランザクション分離レベルは、異なる分離レベルの多様性を提供するが、より弱い並行処理

トランザクション分離レベルの4種類

分離レベル 説明
UNCOMMITTED READ(コミットされていないデータを読みます) トランザクションが読み込み汚れの問題が提出したその他の事項を変更しないで読むことができ、反復不能読み取りとファントム読み取りが表示されます
COMMITEDをREAD(送信されたデータを読みます) 唯一のダーティリードを避けるために、変更が他のトランザクションによって提出された読み取りに取引することができますが、非反復可能読み取りおよびファントム読み込みの問題がまだ発生する可能性があります
REPEATABLE READ(反復可能読み取り) 汚れを避けるためには読み込み、非反復可能読み取り、トランザクションはフィールドから何度も同じ値、トランザクションの間、更新されるこのフィールドに禁止他のトランザクションを読み取ることができていることを確認し、ファントムが読んしかし問題は残ります
SERIALIZABLE(直列化) トランザクションは、テーブルからのトランザクションの期間を同じ行を読み取ることができていることを確認し、他の禁止トランザクションの実行テーブルの挿入、更新、および削除操作を、並行性の問題を避けることができる以上、パフォーマンスは非常に低いです。

READ COMMITEDとSERIALIZABLE:Oracleは、トランザクション分離レベル2をサポートしています。Oracleのデフォルトのトランザクション分離レベル:READ COMMITED

REPEATABLE READ:MySQLは4つのトランザクション分離レベルは、MySQLのデフォルトのトランザクション分離レベルをサポートしています

トランザクション分離レベルのデモ

ダーティー読み取り

図1

IMG

図2

IMG

图3:图1 进行了 rollback

IMG

图4:再次查询图2

IMG

不可重复读

图1

​ 设置数据库事务级别为 read-committed(读已提交数据)

IMG

​ 修改数据,让这个事务处于未提交状态

IMG

图2

​ 开启一个新事务

IMG

图3

IMG

图4:再次查询图2

IMG

​ 发现数据已经更改,由此说明,read-committed事务中,如果T1事务未提交时查询T2事务中的数据时,避免了脏读,但是如果在T1事务已提交,T2事务再次查询时候,发现上一次查询结果数据已经改变(不可重复读)。由此可见,read-committed事务中也有可能出现脏读情况,只是相比 read-uncommitted事务会好些。

可重复读

图1

IMG

图2

IMG

​ 由此可见,这个事务级别没有脏读

图3

IMG

图4

IMG

​ 由此可见,repeatable read事务级别可解决脏读和不可重复读

幻读

图1

IMG

图2

IMG

图3

IMG

​ 解决办法:事务隔离级别修改为最高级(serializabel),修改为最高级别的话,T1开启事务修改数据,T2如果此时插入数据的话,会阻塞(加了锁,等待状态,如果等待时间长,就会超时),等到T1提交了事务,T2会继续执行。

事务级别总结

事务级别 脏读 幻读 不可重复读
read uncommitted
read committed ×
repeatable read × ×
serializabel × × ×

命令

​ # 查看隔离级别

​ select @@tx_isolation;

​ # 设置隔离级别【session:当前,global:全局】

​ set session | global transaction isolation level 隔离级别;

Mysql和Oracle默认事务

​ Mysql中默认的是 repeatable read;

​ Oracle中默认的是 read committed

回滚点

節約のポイントであるセーブポイントのノード、

おすすめ

転載: www.cnblogs.com/yliucnblogs/p/11489393.html