iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >怎样进行MySQL中的事务和锁简单测试
  • 186
分享到

怎样进行MySQL中的事务和锁简单测试

2024-04-02 19:04:59 186人浏览 独家记忆
摘要

本篇文章为大家展示了怎样进行Mysql中的事务和锁简单测试,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 一直以来,对于mysql中的

本篇文章为大家展示了怎样进行Mysql中的事务简单测试,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一直以来,对于mysql中的事务和锁的内容是浅尝辄止,没有花时间了解过,在一次看同事排查的故障中有个问题引起了我的兴趣,虽然过去了很久,但是现在简单总结一下还是有一些收获。
首先我们初始化数据,事务的隔离级别还是Mysql默认的RR,存储引擎为InnoDB
>create table test(id int,name varchar(30));
>insert into test values(1,'aa');
开启一个会话,开启事务。
会话1:
[test]>start transaction;
怎样进行MySQL中的事务和锁简单测试
这个时候我们查看show processlist的信息是不会看到更为具体的SQL等的信息。
怎样进行MySQL中的事务和锁简单测试
我们在另外一个会话中查看事务相关的一个表,Innodb_trx,其实它对应的存储引擎是MEMORY
[infORMation_schema]>select *from innodb_trx\G
怎样进行MySQL中的事务和锁简单测试
然后在会话1执行一条语句。
select * from test where id=1 for update;
再次查看事务表的信息,我们对比前后两次的结果变化,发现唯一的不同是trx_lock_structs的地方,由0变为了2
怎样进行MySQL中的事务和锁简单测试
对于这个字段的含义,可以参考官方文档的介绍。
https://dev.mysql.com/doc/refman/5.6/en/innodb-trx-table.html

对于字段TRX_LOCK_STRUCTS的官方解释如下:
The number of locks reserved by the transaction.

2:
这个时候在会话2中执行语句会发生阻塞,因为存在相应的锁等待。
select * from test where id=1 for update;
等待一段时间,会话2就会提示超时。
[test]>select * from test where id=1 for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
这个地方和一个参数是有关联的,innodb_lock_wait_timeout它会控制阻塞等待的时长。
[test]>show variables like '%innodb_lock_wait_timeout%';
| Variable_name            | Value |
| innodb_lock_wait_timeout | 120   |
对于事务相关的信息查看,在MySQL中有三个比较经典的数据字典,innodb_lock_waits,innodb_trx,innodb_trx,三者可以结合起来,就能够查到相对比较完整的阻塞信息和事务的情况,官方提供的一个SQL如下:
怎样进行MySQL中的事务和锁简单测试
我们简称为check_trx.sql,在这个场景中我们运行check_trx.sql会发现线程3573在等待,阻塞它的正是线程3574
怎样进行MySQL中的事务和锁简单测试

怎样进行MySQL中的事务和锁简单测试
怎样进行MySQL中的事务和锁简单测试
这个时候有一个地方需要注意,那就是通过show engine innodb status得到的结果中,标红的部分可以看出锁是表级锁。这个还是和表的结构有一定的关系。
我们可以换一个方式来测试完善,比如测试一下死锁。

测试死锁
首先给表test添加一条记录
insert into test values(2,'bb');
为了杜绝表级锁,对表test 添加主键,如果采用下面的方式添加主键,竟然不可以,看来oracle用惯了,很多思维方式要复制过来,SQL语法还是有不少地方需要注意。
[test]>alter table test modify id primary key;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL Server vline 1。。。
可以使用下面的方式来添加主键。
[test]>ALTER TABLE test ADD UNIQUE INDEX (id), ADD PRIMARY KEY (id);
Query OK, 2 rows affected (0.25 sec)
Records: 2  Duplicates: 0  Warnings: 0
接下来来复现一下死锁的情况。

1
开启事务,更新id=1的那行数据。
start transaction;
[test]>select * from test where id=1 for update;
+----+------+
| id | name |
+----+------+
|  1 | aa   |
+----+------+
1 row in set (0.00 sec)
这个时候查看innodb_trx的信息,只有1条记录。
怎样进行MySQL中的事务和锁简单测试

会话2
开启事务,更新id=2的那行数据。
start transaction;
select * from test where id=2 for update;
(root:localhost:Sat Oct  8 18:15:10 2016)[test]>select * from test where id=2 for update;
+----+------+
| id | name |
+----+------+
|  2 | bb   |
+----+------+
1 row in set (0.00 sec)
这个时候两者是不存在阻塞的情况,因为彼此都是影响独立的行。
>source check_trx.sql
Empty set (0.00 sec)
查看事务表,里面就是2条记录了。
怎样进行MySQL中的事务和锁简单测试

怎样进行MySQL中的事务和锁简单测试
会话1:
在会话1中修改id=2的数据行。
select * from test where id=2 for update;
查看事务表,会有一条阻塞的信息。
怎样进行MySQL中的事务和锁简单测试

会话2
在会话2中修改id=1的数据行,这个时候会发现存在死锁,而MySQL会毫不犹豫的清理掉阻塞的那个会话。这个过程是自动完成的。
[test]>select * from test where id=1 for update;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
查看阻塞的信息,就会发现已经被清理掉了。
[(none)]>source check_trx.sql
Empty set (0.00 sec)
查看事务表,会发现只有1条记录了。
怎样进行MySQL中的事务和锁简单测试
总体感觉MySQL的数据字典还是比较少,不过使用起来还是比较清晰。

上述内容就是怎样进行MySQL中的事务和锁简单测试,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 怎样进行MySQL中的事务和锁简单测试

本文链接: https://www.lsjlt.com/news/66426.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎样进行MySQL中的事务和锁简单测试
    本篇文章为大家展示了怎样进行MySQL中的事务和锁简单测试,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 一直以来,对于MySQL中的...
    99+
    2024-04-02
  • 如何进行orion的简单测试
    如何进行orion的简单测试,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。orion是一个做IO测试的小巧工具,可以测试随机读写,模拟混合负载等。在oracle 11g已经...
    99+
    2023-06-06
  • 怎么进行MySQL 5.5 MyISAM表锁测试
    这篇文章给大家介绍怎么进行MySQL 5.5 MyISAM表锁测试,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 对于MyISAM表,加的锁是表级锁;写操作...
    99+
    2024-04-02
  • 如何进行MySQL索引条件下推的简单测试
    本篇文章给大家分享的是有关如何进行MySQL索引条件下推的简单测试,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 自MySQL 5.6开始,...
    99+
    2024-04-02
  • SpringBoot中怎么进行单元测试
    在SpringBoot中进行单元测试可以使用JUnit和Spring Boot Test框架。以下是一个简单的示例: 首先,在po...
    99+
    2024-03-07
    SpringBoot
  • 怎么进行Python多线程并发的简单测试
    怎么进行Python多线程并发的简单测试,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。之前也写了一些简单的Python程序,对于多线程的并发一直没有涉及,今天决定先突破一下...
    99+
    2023-06-04
  • Perl中怎么进行测试和调试
    在Perl中进行测试和调试通常使用的工具包括Test模块和调试器。以下是一些常用的方法: 使用Test模块进行单元测试:Test...
    99+
    2024-03-05
    Perl
  • Docker安装canal、mysql进行简单测试与实现redis和mysql缓存一致性
    一、简介 canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求...
    99+
    2023-09-24
    mysql docker canal redis
  • 怎样使用xUnit为.net core程序进行单元测试
    怎样使用xUnit为.net core程序进行单元测试,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一. 导读为什么要编写自动化测试程序(Automated Tests)?可以...
    99+
    2023-06-19
  • 如何进行ABAP和Java SpringBoot的单元测试
    本篇文章为大家展示了如何进行ABAP和Java SpringBoot的单元测试,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ABAP在ABAP类里,本地类(Local Class)里用关键字FOR ...
    99+
    2023-06-02
  • 怎样进行MySQL中的批量初始化数据的对比测试
    本篇文章为大家展示了怎样进行MySQL中的批量初始化数据的对比测试,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。   一直以来对于MySQL的存储过程性...
    99+
    2024-04-02
  • Postman中怎么进行接口测试和自动化测试
    在Postman中进行接口测试和自动化测试可以按照以下步骤进行: 创建一个新的Postman集合:在Postman中,创建一个新...
    99+
    2024-03-13
    Postman
  • C++中怎么使用CppUnit进行单元测试
    这篇文章主要讲解了“C++中怎么使用CppUnit进行单元测试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中怎么使用CppUnit进行单元测试”吧!如果使用VC6,那么直接用VC6打...
    99+
    2023-06-17
  • SpringSecurity中的单元测试是怎样的
    SpringSecurity中的单元测试是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。今天组里的新人迷茫的问我:哥,S...
    99+
    2024-04-02
  • MySql的行级锁和表级锁是怎样的
    MySql的行级锁和表级锁是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 MySql 行级锁 表级锁如何保...
    99+
    2024-04-02
  • 如何进行MySQL句柄恢复的简单尝试
    如何进行MySQL句柄恢复的简单尝试,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 今天突然想起一个问题,那就是对于ibda...
    99+
    2024-04-02
  • Spring MVC中的Controller进行单元测试的实现
    目录导入静态工具方法初始化MockMvc执行测试测试GET接口测试POST接口测试文件上传定义预期结果写在最后对Controller进行单元测试是Spring框架原生就支持的能力,它...
    99+
    2024-04-02
  • 怎样进行mysql sysbench1.0.3 安装以及系统压力测试
    今天就跟大家聊聊有关怎样进行mysql  sysbench1.0.3 安装以及系统压力测试,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。针对系统和数据库压测是项目上线前必做...
    99+
    2023-06-06
  • 在SpringBoot中怎么对restful api进行单元测试
    在SpringBoot中怎么对restful api进行单元测试?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.添加Springboot测试注解@RunWith(Spring...
    99+
    2023-05-31
    restful api springboot
  • 怎样进行简单而不误的VS2003打包
    怎样进行简单而不误的VS2003打包,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我在使用这些小样时,基本上绝大部分基于VS2003的Asp.net工程都因为少...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作