首页 > 数据库 >MySQL的RR和RC事务隔离级别加锁类型验证

MySQL的RR和RC事务隔离级别加锁类型验证

时间:2023-02-28 23:44:50浏览次数:56  
标签:事务 加锁 隔离 RR lock MySQL test 级别 id

  先上结轮:MySQL5.7数据库Innodb引擎在默认的 REPEATABLE-READ(RR) 事务隔离级别时,事务更新操作对于where条件锁定的范围加的是Next-Key Lock 即临键间隙锁,对于确切条件锁定的行加的是RECORD LOCKS 即普通行锁,并且无法读到自身事务范围之外其他事务的提交(自身事务锁定的范围无法被其他事务修改或插入新值);在READ-COMMITTED(RC)事务隔离级别时,事务更新操作对于where范围条件或确切条件锁定的行加的都是RECORD LOCKS 即普通行锁,并且能够读到自身事务锁定行范围之外其他事务的提交(自身事务锁定的行无法被其他事务修改);

-- 打开Innodb状态输出开关
set GLOBAL innodb_status_output=ON;
-- 打开Innodb锁状态输出开关
set GLOBAL innodb_status_output_locks=ON;
-- 查看当前数据库隔离级别
select @@transaction_isolation;
-- 设置会话的事务隔离级别(RR的设为 'READ-COMMITTED' )
set @@session.transaction_isolation = 'REPEATABLE-READ'; 
COMMIT;
-- 设置会话的隔离级别(RR的设为 COMMITTED READ)
set session transaction isolation level REPEATABLE READ;
COMMIT;

-- 以后脚本手工一行一行执行(在另一个窗口,另个其他事务进行各种场景的验证,并到Linux上的MySQL客户端用 show engine innodb status\G 命令查看上锁状态)
BEGIN;
SELECT * from test_user WHERE id=1;
UPDATE test_user set NAME='1234' WHERE id<4;
SELECT * from test_user WHERE id=6;

-- 最后执行回滚
ROLLBACK;

  RR事务隔离级别时的锁状态(临键间隙锁):

2 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 2, OS thread handle 139641668019968, query id 257 192.168.17.1 xurm
Trx read view will not see trx with id >= 6928, sees < 6928  # RR级别多输出的一行,表明了只会产生一次 read view,并确定了其可看到的事务id 范围!
TABLE LOCK table `test`.`test_user` trx id 6928 lock mode IX
RECORD LOCKS space id 26 page no 3 n bits 72 index PRIMARY of table `test`.`test_user` trx id 6928 lock_mode X
Record lock, heap no 2 PHYSICAL RECORD: n_fields 6; compact format; info bits 0

  RC事务隔离级别时的锁状态(排他锁(X)行锁,但非间隙锁):

2 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1
MySQL thread id 2, OS thread handle 139641668019968, query id 630 192.168.17.1 xurm
TABLE LOCK table `test`.`test_user` trx id 6941 lock mode IX
RECORD LOCKS space id 26 page no 3 n bits 80 index PRIMARY of table `test`.`test_user` trx id 6941 lock_mode X locks rec but not gap
Record lock, heap no 8 PHYSICAL RECORD: n_fields 6; compact format; info bits 0

  再配合两种隔离级别下事务范围内的 read view (读视图)生机制:RR事务隔离级别只在第一次MVCC读时生成一次事务的read view,即一次性确定read view的可见事务范围,因此可以做到可重复读而RC事务隔离级别会在每一次MVCC读时都重新生成一次事务的read view,因此能够读到其他事务的已提交数据

 

标签:事务,加锁,隔离,RR,lock,MySQL,test,级别,id
From: https://www.cnblogs.com/xuruiming/p/17166523.html

相关文章

  • mysql字符串等值查询中条件字段值末尾有空格也能查到数据问题
    一、事故还原我们仍然使用学生信息表,但是我们只需要保留两个字段即可:CREATETABLE`student_info`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'学号',`name......
  • mysql 索引知识梳理
    mysql索引知识梳理如果说数据是字典的话,索引就是字典的目录。mysql常用的索引有两种B-Tree(实际上是B+Tree),和Hash,默认是前者(实际上InnoDB只支持BTree)哪些列适合创建......
  • mysql忘记密码
    mysql是在三年前下载的,但是此时密码忘记了,又不想卸载后重新安装,此时需要重置密码.①netstopMySQL80(这个SQL根据服务中SQL的名称填写,网上大部分都是sql,我发......
  • mysql数据库的主主复制和半同步复制
    今天分享的是mysql数据库的主主复制和半同步复制的一系列步骤,以及在各处出现错误的解决方法和其在操作过程中需要注意的地方范例:主主复制主主复制:两个节点,都可以更新数据,并......
  • MySQL参数优化之thread_cache_size
    1.thread_cache_size简介每建立一个连接,都需要一个线程来与之匹配,此参数用来缓存空闲的线程,以至不被销毁,如果线程缓存中有空闲线程,这时候如果建立新连接,MYSQL就会很快的响应......
  • 路飞项目使用mysql数据库详细讲解
    目录一、首先需要彻底删除原有的数据库步骤二、去官网下载mysql步骤三、安装mysql数据库步骤四、一管理员身份进去cmd进行一系列命令启动五、接下来为路飞项目创建数据库六......
  • strerror(介绍与使用)
    strerror:把错误码,翻译成错误信息......
  • 通过java代码向mysql数据库插入记录,中文乱码处理
    处理步骤修改mysql配置文件,并重启mysql服务。mysql默认配置文件路径为/etc/my.cnf。修改配置如下:[mysqld]character-set-server=utf8[client]default-character-set......
  • MySQL 性能优化浅析及线上案例
    作者:京东健康孟飞1、数据库性能优化的意义业务发展初期,数据库中量一般都不高,也不太容易出一些性能问题或者出的问题也不大,但是当数据库的量级达到一定规模之后,如果缺失有......
  • MySql创建存储过程
    #1.插入数据前先把表中的索引去掉,数据插入完成之后,再创建索引#2.关闭事务的自动提交DROPPROCEDUREifEXISTSBatchInsert;#分隔符delimiter$$CREATEPROCEDURE......