私はこの期間に mysql データベースを学習しました。プロジェクト チームは oracle を使用しているため、mysql についての理解は深くありません。この記事は主に mysql ロックの概要です。
#Mysql
ロックは、主に 3 の主要カテゴリに分類されます:
テーブル レベルのロック: ストレージ エンジンは Myisam です。テーブル全体のロックは、オーバーヘッドが低く、ロックが高速で、ロックが強力で、ロック競合の可能性が最も高く、同時実行性が最も低いという特徴があります。
ページレベルのロック: ストレージ エンジンは BDB です。データの特定のページ (16kb あたり) をロックします。特徴: オーバーヘッドとロック時間はテーブル レベルと行レベルの間です。デッドロックが発生します。ロックの強度はテーブル レベルの間です。ロックとロックの間。行ロックの場合、同時実行性は平均的です。
行レベルのロック: ストレージ エンジンは innodb です。特定のデータ行のロックの特徴: ロックの実装はより複雑で高価であり、ロック速度が遅いです。
上記の特性に基づいて、ロックの観点からのみ: テーブル レベルのロックは、主にクエリベースであり、それに応じて更新されるデータが少量しかないアプリケーションにより適しています。 Web アプリケーションなどのインデックス条件には、行レベルのロックが適していますが、オンライン トランザクションなど、多数の異なるデータがインデックス条件に従って同時に更新され、クエリが同時に実行されるアプリケーションには、行レベルのロックがより適しています。処理 (#OLTP) システム。 # 次に、行レベルのロックについて詳しく説明します。行レベルのロックは、主に次の
7カテゴリに分類されます。 ##/排他ロック、意図ロック、レコードロック、ギャップロック、一時ロック、挿入意図ロック、自己インクリメントロック。 共有/排他ロック:
共有ロック: 読み取りロックとも呼ばれ、読み取りは許可されますが、書き込みは許可されません。共有ロックは共有ロックと併用できます。 ステートメント:
select ... lock in share mode排他ロック: 書き込みロックとも呼ばれ、読み取りも書き込みも許可されません。排他ロックは他のロックと一緒に使用できません。
ステートメント: mysql の
select ... for update、
update、delete、insert、alter これらの書き込み操作では、デフォルトで排他ロックが追加されます。 選択デフォルトでは、ロック タイプは追加されません。データの書き込みタスクが完了しないと、他のタスクはデータを読み取ることができなくなり、同時実行操作に大きな影響を与えます。 インテンション ロック: innoDB複数粒度のロックをサポートする、つまり行レベルのロックとテーブル レベルのロックを共存できるようにするには、インテンション ロックを使用します。が紹介されています。インテンション ロックとは、将来のある時点で、トランザクションで共有
/ 排他ロックを追加する必要がある可能性があることを意味します。まず、事前にインテンションを宣言します。このようにして、誰かがテーブル全体を変更しようとした場合、テーブル内のデータがロックされているかどうかを判断する必要はなく、意図したミューテックス ロックが解放されるのを待つだけで済みます。 意図共有ロック (IS
): トランザクションがテーブル内の特定のレコードの共有ロックを取得したい場合は、まず、インテンション共有ロックを追加します。 意図されたミューテックス ロック (IX
): トランザクションがテーブル内の特定のレコードに対してミューテックス ロックを取得したい場合は、まず、意図的なミューテックス ロックを追加します。
意向锁其实不会阻塞全表扫描之外的任何请求,它们的主要目的是为了表示是否有人请求锁定表中的某一行数据。
记录锁(RS):单个行记录上的锁。记录锁总是会锁住索引记录,如果innoDB存储引擎表
在建立的时候没有设置任何一个索引,那么innoDB存储引擎会使用隐式的主键来进行锁定。
间隙锁(GR):间隙锁锁住记录中的间隔,即范围查询的记录。
Select * From user where id between 1 and 10 for update
这个脚本会锁住1到10 的数据,以防止其他事务修改该区间的记录;
间隙锁的主要目的,就是为了防止其他事务在间隔中插入数据,以导致“不可重复读”。如果把事务的隔离级别降级为读提交(Read Committed, RC),间隙锁则会自动失效
临建锁(next-key Locks):临建锁是记录锁和间隙锁的组合,锁的范围既包含记录又包含索引区间。默认情况下,innoDB使用临建锁来锁定记录。但当查询的索引含有唯一属性的时候,临建锁会进行优化,将其降级为记录锁,即仅锁住索引本身,不是范围。
临键锁的主要目的,也是为了避免幻读(Phantom Read)。如果把事务的隔离级别降级为RC,临键锁则也会失效。
插入意向锁(insert intention locks):对已有数据行的修改和删除,必须加互斥锁,对于数据的插入,加插入意向锁。是专门针对于insert操作的。
自增锁(auto-inc locks):是一种特殊的表级别的锁,专门针对事务插入auto-increment类型的列。最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。
---------------------------------------------------------分界线--------------------------------------------------------------
接下看讲一下其他的锁:
死锁:产生是因为线程锁之间交替等待产生的。值两个或两个以上的事务在执行过程中,因争夺资源而造成的一种相互等待的现象。
Mysql处理死锁的方法:根据数据写的数据量的大小来回滚小事务。
乐观/悲观锁:
乐观锁:乐观的假定大概率不会发生并发更新冲突,访问,处理数据的过程中不加锁,只在更新数据时根据版本号或时间戳判断是否有冲突,有则处理,无责提交事务。
如果系统并发量非常大,悲观锁会带来非常大的性能问题,选择使用乐观锁,现在大部分应用属于乐观锁
悲观锁:悲观的假定大概率会发生并发更新冲突,访问,处理数据前就加排他锁,在整个数据处理过程中锁定数据,事务提交或回滚后才释放锁。
优点:
悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。
缺点:
(a)在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;
(b) 読み取り専用のトランザクション処理では、競合が発生しないためロックを使用する必要がありませんが、システムの負荷が増加するだけで、並列性も低下します。トランザクションが特定のデータ行をロックする場合、他のトランザクションはその数の行を処理する前にトランザクションが処理されるまで待機する必要があります。
推奨事項:
以上がmysqlのロック機構を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。