トランザクション関連の知識の概要

1.トランザクションとは何ですか?

トランザクションは、操作の論理的な集合である、または実行中または実行されません。

総務は、最も古典的な例では、転送のために出ていることが多いです。暁明は赤転送に$ 1000与えた場合は、この転送は2つのキー操作を伴うだろうです:千元暁明のバランスを削減する、赤のバランスが千元に増加しました。増加していない赤色暁明バランスのバランスが低下するような銀行の崩壊のような2つのオペレーティングシステム間の突然エラーが発生した場合、これは適切ではありません。総務は、これら二つのキー操作のいずれか、すべてが成功するか、失敗したことを確認することです。

2.トランザクション(ACID)の4つの特徴は

アトミック:トランザクションは実行の最小単位が分裂することはできませんです。アトミックトランザクション操作が完了または全く効果がないことを保証し、
一貫性:およびトランザクションの後、データが一貫している前に、読んでトランザクションデータを複数に同じ結果が同じであり、
アイソレーション:データベースへの同時アクセスは、ユーザートランザクションは、独立した同時トランザクションデータベースの中で、他の企業と干渉しない;
耐久性:トランザクションがコミットされた後。これは、データベースに障害が発生した場合でも、永続的であるデータベース内のデータを変更したり、それにはどんな影響を与える必要があります。

 

典型的なアプリケーションでは、複数のトランザクションを同時に実行、多くの場合、(複数のユーザーが統一されたデータを操作するために)自分のタスクを完了するために同じデータで動作します。同時必要なものの、それは次のような問題が発生することがあります。

ダーティリード(ダーティー読み取り): トランザクションがデータにアクセスされ、データが変更されており、この変更はデータベースに提出されていない場合、別のトランザクションでもこのデータにアクセスし、このデータを使用しています。このデータが提出されていないので、このデータを読んで、他のトランザクションは、あなたが「ダーティデータ」何をしたかに基づいて、「ダーティデータ」とは、ある正しくない可能性があります。溶液:データベーストランザクション分離レベルはREAD_COMMITTEDに調整される(コミット読み取り)


失われた(変更するために失われた)を変更:トランザクションがデータを読み取る場合、を意味する他のトランザクションは、データにアクセスし、次いで、第2のトランザクションの後に、この最初のトランザクションでデータを変更しても、このデータを修正します。そのような修飾は、トランザクション最初のものをもたらす、修飾と呼ばれる程度の損失を失っています。例:トランザクション1は、データテーブルA = 20、A =読み取り、トランザクション2 20、改変トランザクションA = A-1、A修正トランザクション2 = A-1、A =最終結果19、トランザクションを読み出し改正1が失われます。

非反復可能読み取り(Unrepeatableread):トランザクション内の手段は、同じデータを複数回読み込みます。この取引が終わっていない場合は、他のトランザクションは、データにアクセスします。2が原因2番目のトランザクションの変更に、最初のトランザクションでデータを読み取る最初のトランザクションデータにつながっ間ので、同じ二度ではない読み取ることができます。これは、データがそれほど非反復可能読み取りと呼ばれ、同じような状況ではありません読みトランザクション以内に2回起きました。

非反復可能読み取りの例

トランザクション1では、マリアは彼の1000年の給与を読んで、操作は完了しませんでした
トランザクションを開始。
選択給与から employeewhere ID = MaryID。

問題2では、時に財務スタッフは、2000年のメアリー賃金を変更して、トランザクションを提出しました。
トランザクションを開始。
更新employeeset給与 = 2000 ここで、 ID = MaryID。
コミット;

トランザクション1が、メアリーは再び彼らの賃金を読んだとき、給与が2000上がります
選択給与から employeewhere ID = MaryID。

トランザクションの前と後の結果は、非反復可能読み取りで、その結果、活性化された二を読み取りません。
溶液:データベーストランザクション分離レベルはREPEATABLE_READに調整される(反復可能読み取り)

マジック読書(ファントムリード): マジックリーディングとまたとないは等を読み出し。データの一部に挿入された別の同時トランザクション(T2)、続いて複数のデータラインを、読み取られるトランザクション(T1)で起こります。次のクエリでは、最初のトランザクション(T1)は、同じようにファントム読み取りと呼ばれる、幻覚が起こったかのように、いくつかのオリジナルのレコードは、存在しないよりも多くを見つけるでしょう。
溶液:データベーストランザクション分離レベルがSERIALIZABLE_READに調整される(シリアライズ)

非再現性と区別ファントムを読む:
非反復可能読み取りの焦点は、複数のそのような変更されたように見られるの読み取り多くのレコードとして、ファントムは、フォーカスがレコードを追加または削除読んで、いくつかの列の値を変更された一つのレコードが見つかっ読み込み増加または減少。

トランザクション分離レベルは何ですか?MySQLのデフォルトの分離レベルがありますか?

SQL標準は、分離の4つのレベルを定義しています。

READ UNCOMMITTED-(非コミット読み取り):隔離の最低レベルを、変更が提出されたデータの読み取りを許可されていない、汚れが読み込み可能性があり、反復不能読み取りまたはファントム読み取り。
READ-COMMITTED(コミット読み取り): ダーティリード、しかし、ファントム読み取りまたは非反復可能読み取りがまだ発生する可能性が防ぐことができ、同時トランザクションが既に提出されたデータを読み取ることができます。
REPEATABLE-READ(反復可能読み取り):複数のデータは、その事務自身変更されない限り、同じフィールドの結果は、同じ読み、ダーティリードと繰り返し不可能読みますが、ファントムはまだ起こり読み込み防ぐことができます。
SERIALIZABLE(直列化):分離の最高レベル、完全に準拠ACID分離レベル。すべてのトランザクションを順に一つずつ実行する、そのような問題との間の干渉を生成することは不可能である、すなわち、このレベルは、ダーティ・リード防止、非反復読み取り、ファントム読み取り。

MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation;命令来查看

这里需要注意的是:与 SQL 标准不同的地方在于 InnoDB 存储引擎在 REPEATABLE-READ(可重读)事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以说InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 已经可以完全保证事务的隔离性要求,即达到了 SQL标准的SERIALIZABLE(可串行化)隔离级别。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容):,但是你要知道的是InnoDB 存储引擎默认使用 REPEATABLE-READ(可重读)并不会有任何性能损失。

InnoDB 存储引擎在 分布式事务 的情况下一般会用到SERIALIZABLE(可串行化)隔离级别。

锁机制与InnoDB锁算法

MyISAM和InnoDB存储引擎使用的锁:
MyISAM采用表级锁(table-level locking)。
InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁

 

表级锁和行级锁对比:

 

  • 表级锁: MySQL中锁定 粒度最大 的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,触发锁冲突的概率最高,并发度最低,MyISAM和 InnoDB引擎都支持表级锁。

  • 行级锁: MySQL中锁定 粒度最小 的一种锁,只针对当前操作的行进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。

 

InnoDB存储引擎的锁的算法有三种:

 

  • Record lock:单个行记录上的锁

  • Gap lock:间隙锁,锁定一个范围,不包括记录本身

  • Next-key lock:record+gap 锁定一个范围,包含记录本身

最后说一下MyISAMInnoDB区别

MyISAM是MySQL的默认数据库引擎(5.5版之前)。虽然性能极佳,而且提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。不过,5.5版本之后,MySQL引入了InnoDB(事务性数据库引擎),MySQL 5.5版本后默认的存储引擎为InnoDB。

大多数时候我们使用的都是 InnoDB 存储引擎,但是在某些情况下使用 MyISAM 也是合适的比如读密集的情况下。(如果你不介意 MyISAM 崩溃回复问题的话)。

两者的对比:

  1. 是否支持行级锁 : MyISAM 只有表级锁(table-level locking),而InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。

  2. 是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。但是InnoDB 提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

  3. 是否支持外键: MyISAM不支持,而InnoDB支持。

  4. 是否支持MVCC :仅 InnoDB 支持。应对高并发事务, MVCC比单纯的加锁更高效;MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作;MVCC可以使用 乐观(optimistic)锁 和 悲观(pessimistic)锁来实现;各数据库中MVCC实现并不统一。推荐阅读:MySQL-InnoDB-MVCC多版本并发控制

 

おすすめ

転載: www.cnblogs.com/du001011/p/11291932.html