加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL RC 和RR隔离级别差别性

发布时间:2022-04-05 07:03:51 所属栏目:MySql教程 来源:互联网
导读:今天一个朋友咨询我关于MYSQL 的LOCK,我针对他的问题,整理了一篇BLOG,供大家了解学习,有兴趣的同学可以参考来测试加深原理的理解。 结论: 1.RR隔离级别并发性没有RC好 2、开发过程中,事务要尽量小,结束要快 3、需要创建合适的索引来减少全表扫的概率
       今天一个朋友咨询我关于MYSQL 的LOCK,我针对他的问题,整理了一篇BLOG,供大家了解学习,有兴趣的同学可以参考来测试加深原理的理解。
 
      结论:
     1.RR隔离级别并发性没有RC好
     2、开发过程中,事务要尽量小,结束要快
     3、需要创建合适的索引来减少全表扫的概率
  
RR隔离级别的诡异现象,RC隔离级别比RR隔离级别的并发性好
 
1、隔离级别为RR 查看如下:
mysql> show variables like '%iso%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)
2、创建测试表t_test4且插入4条记录
create table t_test4(id int,name varchar(20));
INSERT INTO T_TEST4 VALUES(4,'wuhan');
 
4、开启会话2,做插入语句,此时语句2直接挂起直到会话1提交或者等待INNODB超时时间自动回滚,
查看INNODB 超时时间(这里默认是50秒):
mysql> show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |--默认50秒
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+-----------------------------+----------+
12 rows in set (0.00 sec)
 
mysql> insert into t_test4 values(4,'zhej');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
 
可见插入语句无法执行成功。在测试中我们来分别观察information_schema.innodb_trx,information_schema.innodb_locks,information_schema.innodb_lock_waits
 
数据如下:可见会话152,插入语句堵塞了,会话151,UPDATE语句锁定了5行,但是我们只需要修改一行。
 
mysql> select * from information_schema.innodb_trx G
*************************** 1. row ***************************
trx_id: 579737
trx_state: LOCK WAIT
trx_started: 2017-09-02 01:29:12
trx_requested_lock_id: 579737:121:3:1
trx_wait_started: 2017-09-02 01:29:12
trx_weight: 2
trx_mysql_thread_id: 152
trx_query: insert into t_test4 values(4,'zhej')
trx_operation_state: inserting
trx_tables_in_use: 1
trx_tables_locked: 1
trx_lock_structs: 2
trx_lock_memory_bytes: 360
trx_rows_locked: 1
trx_rows_modified: 0
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 10000
trx_is_read_only: 0
trx_autocommit_non_locking: 0
*************************** 2. row ***************************
trx_id: 579733
trx_state: RUNNING
trx_started: 2017-09-02 01:05:27
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 3
trx_mysql_thread_id: 151
trx_query: select * from information_schema.innodb_trx
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 0
trx_lock_structs: 2
trx_lock_memory_bytes: 360
trx_rows_locked: 5
trx_rows_modified: 1
trx_concurrency_tickets: 0
trx_isolation_level: REPEATABLE READ
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 10000
trx_is_read_only: 0
trx_autocommit_non_locking: 0;
测试到这里,大家应该可以发现隔离级别在RR情况下,并发性不好,那原因是什么呢?
 
小结如下:1、开发过程中,事务要尽量小,结束要快
2、需要创建合适的索引来减少全表扫的概率
 
2、修改隔离级别,临时性修改如下(如果永久性修改需要修改my.cnf文件)这里修改完了切记退出会话重新登录。
mysql> set global tx_isolation='READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!