MySQL中的锁比较繁杂,但其实MySQL中的锁本质上并没有那么多,只是我们站在不同维度上对锁进行的分类,本文主要介绍MySQL中锁的类型及用途。
基于锁的属性分类,可以分为:
基于锁的粒度分类,可以分为:
基于锁的状态分类:可以分为:
共享锁又称读锁,简称S锁。
当一个事务为数据加上读锁后,其他事务只能对该数据加读锁而不能对数据加写锁,直到所有的读锁释放之后其他事务才能对其加写锁。
共享锁的特性主要是为了支持并发的读取数据,读取数据的时候不支持对数据进行任何修改。
排他锁又称写锁,简称X锁。
当一个事务为数据加上写锁后,其他事务将不能再为数据加任何锁,直到该锁释放之后其他事务才能对数据进行加锁。
排他锁的目的是在数据修改的时候,不允许其他人同时修改,也不允许其他人读取,避免出现脏数据和脏读的问题。
表锁是指上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁,才能进行对表的访问。
其特点是:粒度大,加锁简单,容易冲突,所以支持的并发较低。
行锁是指上锁的时候锁住的是表中的某一行或多行记录,其他事务不能访问被锁住的记录,但可以访问未被锁住的记录。
其特点是:粒度小,加锁比表锁麻烦,但不容易冲突,相比表锁可以支持更高的并发。
记录锁属于行锁的一种,只不过记录锁的范围只是表中的某一条记录。
那么什么时候会出现记录锁呢?
答案是精确条件命中,并且命中的条件字段是唯一索引。
如果你使用的是普通索引,虽然某个查询最终也仅命中了表中的1条记录,它也不会加记录锁,必须是命中了唯一索引
加了记录锁之后,可以避免数据在查询的时候被修改,也避免了在修改的事务未提交前被其他事务读取,引发脏读问题。
页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。
表级锁加锁速度快,但冲突多,行级锁冲突少,但是加锁速度慢,而页级锁相对折中,一次锁定一页的数据。
其特点是:锁定粒度、开销和加锁时间介于表锁和行锁之间,并发度一般,和行锁一样也会出现死锁。
属于行锁的一种,间隙锁是在事务加锁后其锁住的是表记录的某一个区间,包括记录之间的间隙,遵循左开右闭原则。
它的存在可以解决幻读问题,另外需要注意,Gap Lock 只在 REPEATABLE READ 隔离级别下有效(在MySQL的 REPEATABLE READ 隔离级别中,它已经帮我们解决了幻读问题,解决的方案就是 Gap Lock)
临键锁也属于行锁的一种,并且它是InnoDB引擎的行锁默认算法。
临键锁Next-Key Lock 可以理解为是 Record Lock 和 Gap Lock 的结合体。
正常来说,我们加行锁的基本单位就是 Next-Key Lock,即既有记录锁又有间隙锁(但是有时候 Next-Key Lock 会退化)。
Next-Key Lock 的加锁规则:
InnoDB支持多粒度锁,为了允许行锁和表锁共存,InnoDB引入了意向锁的概念。
意向锁是一种表级锁,它用来指示事务稍后对表中的行需要哪种类型的锁(共享或独占)
意向锁分为:
值得注意的是:
数据行共享锁S、排它锁X发生冲突下面的矩阵总结了表级锁类型的兼容性:

AUTOINC 锁又叫自增锁(一般简写成 AI 锁)。
它是一种表锁,当表中有自增列(AUTOINCREMENT)时出现。
当插入表中有自增列时,数据库需要自动生成自增值,它会先为该表加 AUTOINC 表锁,阻塞其他事务的插入操作,这样保证生成的自增值肯定是唯一的。
AUTOINC 锁具有如下特点:
- AUTO_INC 锁互不兼容,也就是说同一张表同时只允许有一个自增锁;
- 自增值一旦分配了就会 +1,如果事务回滚,自增值也不会减回去,所以自增值可能会出现中断的情况。
显然,AUTOINC 表锁会导致并发插入的效率降低,为了提高插入的并发性,MySQL 从 5.1.22 版本开始,引入了一种可选的轻量级锁(mutex)机制来代替 AUTOINC 锁,可以通过参数 innodbautoinclockmode 来灵活控制分配自增值时的并发策略。具体可以参考 MySQL 的 AUTOINCREMENT Handling in InnoDB 一文。
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
我正在尝试绕过rails配置这个极其复杂的迷宫。到目前为止,我设法在ubuntu上设置了rvm(出于某种原因,ruby在ubuntu存储库中已经过时了)。我设法建立了一个Rails项目。我希望我的测试项目使用mysql而不是mysqlite。当我尝试“rakedb:migrate”时,出现错误:“!!!缺少mysql2gem。将其添加到您的Gemfile:gem'mysql2'”当我尝试“geminstallmysql”时,出现错误,告诉我需要为安装命令提供参数。但是,参数列表很大,我不知道该选择哪些。如何通过在ubuntu上运行的rvm和mysql获取rails3?谢谢。
目录1、yum安装mysql修改密码(1)在mysql里面修改(2)第二种方式,利用mysqladmin修改密码2、没有密码,登录mysql修改密码3、mysql的安全设置1、yum安装mysql在CentOS中默认安装有MariaDB(MySQL的一个分支),安装完成之后可以直接覆盖MariaDB。rpm-qa|grepmariadb查询是否安装了mariadbrpm-e--nodepsmariadb-libs-5.5.60-1.el7_5.x86_64卸载mariadwgethttp://dev.mysql.com/get/mysql57-community-release-el7-11.
我是Ruby的新手。我安装了DataMapper并且正在尝试安装dm-mysql-adapter-1.0.2gem。但是当我尝试安装时,出现以下错误。我正在使用ubuntu操作系统。vinoth@vinoth-laptop:~/Downloads$geminstalldm-mysql-adapter-1.0.2----with-mysql-lib=/usr/lib/mysql----with-mysql-conf=/usr/bin/mysqlWARNING:Installingto~/.gemsince/home/vinoth/gemsand/home/vinoth/gems/bina
我目前正在构建一个需要mysql2gem的RoR项目。我成功安装了gem。因为它出现在我的gem列表中。[root@vc2cmmka035538nsimple_cms]#gemlist***LOCALGEMS***actionmailer(3.2.3)actionpack(3.2.3)activemodel(3.2.3)activerecord(3.2.3)activeresource(3.2.3)activesupport(3.2.14,3.2.3)arel(3.0.2)bigdecimal(1.1.0)builder(3.2.2,3.0.0)bundler(1.1.5)c2c_li