当 where 条件使用二级索引筛选数据时,会对二级索引命中的条目和对应的聚簇索引都加锁;所以其他事务变更命中加锁的聚簇索引时,都会等待锁 。
行锁的增加是一行一行增加的,所以可能导致并发情况下死锁的发生 。
例如 ,
在 session A 对符合条件的某聚簇索引加锁时,可能 session B 已持有该聚簇索引的 Record Locks , 而 session B 正在等待 session A 已持有的某聚簇索引的 Record Locks 。
session A 和 session B 是通过两个不相干的二级索引定位到的聚簇索引 。
session A 通过索引 idA,session B通过索引 idB。
当 where 条件获取的数据无间隙时,无论隔离级别为 rc 或 rr,都不会存在间隙锁 。
比如通过唯一索引获取到了已完全填充的数据范围,此时不需要间隙锁 。
间隙锁的目的在于阻止数据插入间隙,所以无论是通过 insert 或 update 变更导致的间隙内数据的存在,都会被阻止 。
rc 隔离级别模式下 , 查询和索引扫描将禁用 gap locking , 此时 gap locking 仅用于外键约束检查和重复键检查(主要是唯一性检查) 。
rr 模式下,为了防止幻读,会加上 Gap Locks 。
事务中,SQL 开始则加锁,事务结束才释放锁 。
就锁类型而言,应该有优化锁 , 锁升级等,例如rr模式未使用索引查询的情况下,是否可以直接升级为表锁 。
就锁的应用场景而言 , 在回放场景中,如果确定事务可并发 , 则可以考虑不加锁 , 加快回放速度 。
锁只是并发控制的一种粒度,只是一个很小的部分:
从不同场景下是否需要控制并发,(已知无交集且有序的数据的变更 , MySQL 的 MTS 相同前置事务的多事务并发回放)
并发控制的粒度,(锁是一种逻辑粒度,可能还存在物理层和其他逻辑粒度或方式)
相同粒度下的优化,(锁本身存在优化,如IX、IS类型的优化锁)
粒度加载的安全性能(如获取行锁前,先获取页锁,页锁在执行获取行锁操作后即释放,无论是否获取成功)等多个层次去思考并发这玩意 。
mysql默认事务隔离级别SQL标准中支持4种事务隔离级别,READ_UNCOMMITTED(读未提交),READ_COMMITTED(读已提交),REPEATABLE_READ(可重复读) , SERIALIZABLE(串行读),MySQL innodb引擎支持全部这4种事务隔离级别 。
工具/原料:
联想Y7000P
Windows10
MySQL6.0
1、启动命令行窗口 , 连接MySQL数据库
图示,通过MySQL提供的客户端命令mysql连接MySQL数据库 。
2、通过系统变量查询数据库当前事务隔离级别
图示 , 通过查询数据库提供的系统变量 tx_isolation 或 transaction_isolation 的值即可获取当前的事务隔离级别 。MySQL数据库默认的事务隔离级别是REPEATABLE_READ (可重复读) 。
3、设置本次会话的事务隔离级别
图示 , 通过命令set session transaction isolation level可以设置本次会话的事务隔离级别,该设置不会影响其他会话,并且设置会随着当前会话的结束而结束 。
4、设置全局会话的事务隔离级别
图示,通过命令set global transaction isolation level可以设置全局会话的事务隔离级别 , 该设置不会影响当前已经连接的会话 , 设置完毕后,新打开的会话,将使用新设置的事务隔离级别 。
5、设置一次操作的事务隔离级别
图示,通过命令set transaction isolation level可设置下一次事务操作的隔离级别,该设置会随着下一次事务的提交而失效 。
关于mysql怎么看隔离和查看mysql数据库隔离级别的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
- mysql游标和存储过程是什么 mysql游标表名为变量
- 如何使用cmd命令行提示符登录mysql服务器 cmd中登陆mysql
- mysql怎么设置时区 mysql时间显示设置
- 招聘要精通mysql
- mysql 65535 8192 限制 mysql限制资源使用
- mysql有topn
- mysql协议包解析 mysqlicp协议
- mysql子查询和连接查询 mysql子查询插入
- Mysql使用索引查询 mysql使用round
- 云服务器游戏出现黑屏问题怎么解决? 云服务器游戏黑屏怎么办
