Mysql-锁

摘要:
MySQL中的默认数据引擎是MyISAM。不幸的是,此引擎不支持事务处理。我们需要将默认数据引擎更改为InnoDB。启动InnoDB引擎的方法如下:1)关闭MySQL服务2)修改my.ini以删除默认存储引擎=InnoDB(#)之前的注释,并删除skip InnoDB(plus#)的注释3)保存并重新启动MySQL服务;InnoDB实现了以下两种类型的行锁。意向锁由InnoDB自动添加,无需用户干预。

Mysql中默认的是MyISAM数据引擎,可惜此引擎不支持事务处理,我们需要将默认的数据引擎改为InnoDB。InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。

启动InnoDB引擎的方法如下:

1)关闭mysql的服务

2)修改my.ini

将default-storage-engine=INNODB前的注释(#)去掉

将skip-innodb这行注释(加上#)

3)保存后重启mysql服务;


 InnoDB实现了以下两种类型的行锁。

共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。
意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
 
 InnoDB行锁模式兼容性列表
Mysql-锁第1张

如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。

意向锁是InnoDB自动加的,不需用户干预。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁;事务可以通过以下语句显示给记录集加共享锁或排他锁。

¡  共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。

¡  排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。

InnoDB默认是行级别的锁,当有明确指定的主键时候,是行级锁。否则是表级别。

Hibernate中悲观锁的实现,是基于for update。

开启窗口:

Mysql-锁第2张

Mysql-锁第3张

可以看到,被另一个窗口锁住了。

for update 注意:

1.for update 仅适用于InnoDB,并且必须开启事务,在begin与commit之间才生效。

2.要测试for update的锁表情况,可以利用MySQL的Command Mode,开启二个视窗来做测试。

3.当开启一个事务进行for update的时候,另一个事务也有for update的时候会一直等着,直到第一个事务结束或等待锁时间超时

 Mysql-锁第4张

Mysql-锁第5张

4.如果没查到记录会锁表,将会锁表。

查看锁情况的sql:

#查询表级锁争用情况
show status like 'c_tbl_users%';
#获取InnoDB行锁争用情况
show status like 'innodb_row_lock%';
#查看锁表情况
#Table_locks_immediate 指的是能够立即获得表级锁的次数 Table_locks_waited 指的是不能立即获取表级锁而需要等待的次数
show status like 'Table%';
show status like '%lock%';
show open tables from chen;

Mysql-锁第6张

参考:

https://www.cnblogs.com/jukan/p/5670950.html

免责声明:文章转载自《Mysql-锁》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MFC画刷类CBrush使用实例 .Animation 动画详解(一)——alpha、scale、translate、rotate、set的xml属性及用法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

centos7安装配置mysql8

 centos7安装配置mysql8 第一步:下载mysql 百度云下载地址:链接:https://pan.baidu.com/s/1HPG0Yju9wd9T2VULZIb03g    提取码:z299 第二步:查找并卸载原有的mysql数据库        1、 使用rpm -qa | grep mysql 命令查找mysql数据库软件包及依赖包,若没有...

SQL中连接(JOIN)子句介绍

本文主要介绍 SQL(Structured Query Language)中连接(JOIN)子句的相关知识,同时通过用法示例介绍连接的常见用法。 说明:本文的用法示例是面向 MySQL 数据库的。 1 概述SQL 中 JOIN 子句用于把来自两个或多个表的行结合起来。 在实际的数据库应用中,经常需要从多个数据表中读取数据,这时就可以使用 SQL 语句中的连...

四. sql上线平台---不推荐

一.安装inception及使用1安装基础环境:   inception是一个集审核、执行、备份及生成回滚语句于一身的MySQL自动化运维工具. 注意,Centos7一定要制定bison版本不高于2.6,否则Inception可能会出现编译错误,该下载速度十分缓慢,可以考虑长时间等待或者更换镜像源。 下载Inception安装包: Inception源地址...

MYSQL 数据库导入导出命令

在不同操作系统或MySQL版本情况下,直接拷贝文件的方法可能会有不兼容的情况发生。所以一般推荐用SQL脚本形式导入。下面分别介绍两种方法。 MySQL命令行导出数据库 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:Program FilesMySQLMySQL Server 4.1in (或者...

MySQL语句错误:Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT)

两张表的字段分别是两种不同的比较规则,在进行联表查询的时候就会出现上述错误。字符比较规则有各个层级的,比如数据库、表、字段,这里只需要保证字段的比较规则一致即可。但是为了整体一致,除了特殊的业务需求,我们最好还是保证库、表、字段的比较规则一致。 -- ---------------------------- -- Table structure for a...

【Navicat】MySQL 8.0.17 数据库报2059错误

【Navicat】MySQL 8.0.17 数据库报2059错误 Navicat 建立MySQL连接时报错: 解决方法来自博文:https://blog.csdn.net/jabony/article/details/81436635 原文如下: 前提: 最近新安装了MySQL 8,用Navicat连接时出现了出现2059错误 原因:这是由于新版本的M...