浅析MySQL 锁和事务


本文整理自网络,侵删。

MySQL本身也是在文件系统的基础上发展而来,因为锁的存在使之有所不同。

MySQL作为一种数据库软件,难免会存在对其共享资源的并发访问,为了协调和管理不同资源的并发访问,也就产生了锁机制,因为锁机制的存在为数据库提供了数据的完整性和一致性。

从锁的级别来分锁可分为:行级锁、表级锁、页级锁。
从锁的类型来分锁可分为:共享锁、排它锁(独占锁)。
为了协调行锁、表锁产生了:意向锁(表级锁)。

共享锁,允许事务去读取数据。
排它锁,允许事务去修改或删除数据。
意向锁,获取行级锁的时候,自动添加的表级锁,包含:意向共享锁、意向排它锁。

对于MyISAM存储引擎,只支持表锁,而InnoDB存储引擎则支持行锁、表锁。

MyISAM存储引擎修改、删除数据的时候,会产生排它锁,锁定的整张表,并发写入性能较差,而读取的时候产生的是共享锁,不会锁定表,读取性能就比较好。

InnoDB存储引擎修改、删除数据的时候,会产生排它锁,锁定的特定索引记录,一般不会影响表中的其它行,并发写入性能较好,而读取的时候产生的是共享锁,不会锁定表和行,读取性能较好。

行锁锁定的是索引记录,而不是记录行,如果没有索引,则使用隐式索引进行锁定。

当一张表某些行已经获取了排它锁,在表中会产生一个意向排它锁,如果此时有一个事务要来锁定整张表,那么一看有意向排它锁的存在,该事务就会被阻塞,通过意向锁直接就可以知道能不能锁定表,不需要逐行去遍历检测是否有排它锁,通过意向锁高效地协调了行锁和表锁的关系。

行级锁按照锁定范围来分,又分为三种:

  • Record Lock 单行记录上的锁。
  • Gap Lock 间隙锁,锁定一个范围,不包含记录本身。
  • Next-Key Lock 锁定一个范围,包含记录本身,用于解决幻读问题。

当然,锁也是有利有弊的,也可能出现死锁的情况。
当两个或两个以上的事务在执行过程中,因争夺资源而造成一种相互等待的现象,称为死锁。

最后,也是因为锁的存在,丰富了后续事务的功能。

MySQL通过设计一种机制,使得数据能够完整地从一种一致性状态切换到另一种一致性状态,这种机制称为事务。

事务包含有四大特性:原子性(A)、一致性(C)、隔离性(I)、持久性(D),简称酸性。

  • 原子性:事务中的操作,要么全部成功,要么全部失败,不可切分。
  • 一致性:事务将数据库从一种一致性状态转变成另外一种一致性状态,并且保证数据的完整性。
  • 隔离性:又称并发控制,事务在提交之前对于其它事务是处于不可见的状态的。
  • 持久性:事务一旦提交,结果就是永久性的,不会因为数据库宕机而丢失数据。

原子性、持久性是通过redo日志实现的,一致性是通过undo日志实现的,隔离性是通过锁机制实现的。

阅读剩余部分

相关阅读 >>

解决mysql不是内部或外部命令也不是可运行的程序或批处理文件的问题

mysql 中文乱码解决办法

windows安装mysql8.0.x 版本教程

mysql如何将多行变成多列

mysql外键约束怎么写

mysql如何正确地利用aes_encrypt()与aes_decrypt()加解密

mssql和mysql哪个好

mysql优化特定类型的查询(代码示例)

mysql学习之临时表相关总结

mysql初次不能登录解决方法

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...