我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中next-lock锁的应用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL中next-lock锁的应用

这篇文章主要讲解了“MySQL中next-lock锁的应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中next-lock锁的应用”吧!

结论:
a. Mysql 由于 next-lock 锁的存在,按更新语句的where条件的索引来锁定一个范围的记录。
如果索引不存在,那么会锁住整个表的记录。如果该条件是primary key,那么就是变为行锁。
b. next-lock是为了避免幻想读,所以在默认的 repeated read 的状况下会有这种情况。
c. 对于 read commited 的隔离级别,不会使用next-lock锁,而是使用行锁,这也是oracle的方式,
这种情况下,对并发的支持比 repeated read 要好些。


1. 设置会话级别的隔离级别为可重复读
set tx_isolation='repeatable-read';


2. 检查:会话级别已经修改,但是全局级别还是没有改的。
root@test 12:11:56>show variables like '%iso%';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)


root@test 12:12:06>show global variables like '%iso%';
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| tx_isolation  | READ-COMMITTED |
+---------------+----------------+


3. 在该会话里开启一个事务,更新表的一行记录
root@test 12:19:12>begin;
Query OK, 0 rows affected (0.00 sec)
 
由于这个表里没有索引,所以由于next-lock的存在,所以即使只有更新一行,但是实际上已经对所有的记录上锁了。
root@test 12:19:20>update test set name='aa11' where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0


4. 验证: 开启另一个会话,尝试更新另外一条数据,发现一直等锁,直到超时报错。
root@test 12:19:39>update test set name='bb11' where id=2;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction


insert 同样因为有锁,而发生等待,直到报错。
root@test 12:20:02>insert into test values (3,'cc');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction


5. 进行检查锁的信息:只有事务的信息,并没有锁的信息。即使在read-committed的隔离级别下也没有锁的信息。
select * from innodb_trx\G
*************************** 2. row ***************************
                    trx_id: 151933845
                 trx_state: RUNNING
               trx_started: 2016-08-18 12:19:33
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 3
       trx_mysql_thread_id: 31
                 trx_query: NULL
       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: 3
         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
2 rows in set (0.00 sec)


root@information_schema 12:31:26>select * from INNODB_LOCKS;
Empty set (0.00 sec)
状态信息Innodb_current_row_locks能显示出锁的信息。
root@test 01:43:13>show status like '%lock%';
+------------------------------------------+-------+
| Variable_name                            | Value |
+------------------------------------------+-------+
| Com_lock_tables                          | 0     |
| Com_lock_tables_for_backup               | 0     |
| Com_lock_binlog_for_backup               | 0     |
| Com_show_slave_status_nolock             | 0     |
| Com_unlock_binlog                        | 0     |
| Com_unlock_tables                        | 0     |
| Handler_external_lock                    | 2     |
| Innodb_deadlocks                         | 0     |
| Innodb_row_lock_current_waits            | 0     |
| Innodb_current_row_locks                 | 2     |
| Innodb_row_lock_time                     | 12002 |
| Innodb_row_lock_time_avg                 | 6001  |
| Innodb_row_lock_time_max                 | 6001  |
| Innodb_row_lock_waits                    | 2     |
| Innodb_s_lock_os_waits                   | 100   |
| Innodb_s_lock_spin_rounds                | 3455  |
| Innodb_s_lock_spin_waits                 | 1550  |
| Innodb_x_lock_os_waits                   | 48    |
| Innodb_x_lock_spin_rounds                | 5238  |
| Innodb_x_lock_spin_waits                 | 1539  |
| Key_blocks_not_flushed                   | 0     |
| Key_blocks_unused                        | 53578 |
| Key_blocks_used                          | 7     |
| Performance_schema_locker_lost           | 0     |
| Performance_schema_rwlock_classes_lost   | 0     |
| Performance_schema_rwlock_instances_lost | 0     |
| Qcache_free_blocks                       | 1     |
| Qcache_total_blocks                      | 1     |
| Table_locks_immediate                    | 126   |
| Table_locks_waited                       | 0     |
+------------------------------------------+-------+
30 rows in set (0.00 sec)


6. 进一步验证:INNODB_LOCKS 表的数据,只有等锁的语句正在执行的期间才会显示,Lock wait timeout 之前才会显示,这一点和Oracle的v$locked_object的视图信息是不一致的,
这个视图会显示当前哪些会话在哪些对象上上了锁。
root@information_schema 02:44:02>select * from INNODB_LOCKS \G
*************************** 1. row ***************************
    lock_id: 151933860:250:3:1
lock_trx_id: 151933860
  lock_mode: X
  lock_type: RECORD
 lock_table: `test`.`test`
 lock_index: GEN_CLUST_INDEX
 lock_space: 250
  lock_page: 3
   lock_rec: 1
  lock_data: supremum pseudo-record
*************************** 2. row ***************************
    lock_id: 151933845:250:3:1
lock_trx_id: 151933845
  lock_mode: X
  lock_type: RECORD
 lock_table: `test`.`test`
 lock_index: GEN_CLUST_INDEX
 lock_space: 250
  lock_page: 3
   lock_rec: 1
  lock_data: supremum pseudo-record
2 rows in set (0.00 sec)


--此时也能看出在等待那个锁,那个session
root@information_schema 04:41:40>select * from INNODB_LOCK_WAITS \G
*************************** 1. row ***************************
requesting_trx_id: 151933866    (请求锁的事务ID)e
requested_lock_id: 151933866:250:3:5
  blocking_trx_id: 151933845     (阻塞锁的事务ID)
 blocking_lock_id: 151933845:250:3:5  
1 row in set (0.00 sec)


7. 综述如果有语句执行超时,要判断哪个线程,哪个语句锁住了数据,可以用下面的sql
    select a.lock_table,a.lock_type,a.lock_space,c.trx_mysql_thread_id,
        d.Command,d.Info, d.State,d.Time, d.Rows_sent, d.Rows_examined
 from INNODB_LOCKS a, INNODB_LOCK_WAITS b, innodb_trx c, processlist d
where a.lock_trx_id=b.blocking_trx_id 
  and a.lock_trx_id=c.trx_id
  and c.trx_mysql_thread_id=d.id
  
+---------------+-----------+------------+---------------------+---------+------+-------+-------+-----------+---------------+
| lock_table    | lock_type | lock_space | trx_mysql_thread_id | Command | Info | State | Time  | Rows_sent | Rows_examined |
+---------------+-----------+------------+---------------------+---------+------+-------+-------+-----------+---------------+
| `test`.`test` | RECORD    |        250 |                  31 | Sleep   | NULL |       | 10848 |         2 |             2 |
+---------------+-----------+------------+---------------------+---------+------+-------+-------+-----------+---------------+
1 row in set (0.00 sec)

感谢各位的阅读,以上就是“MySQL中next-lock锁的应用”的内容了,经过本文的学习后,相信大家对MySQL中next-lock锁的应用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL中next-lock锁的应用

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

下载Word文档

猜你喜欢

浅谈MySQL next-key lock 加锁范围

前言 某天,突然被问到 MySQL 的 next-key lock,我瞬间的反应就是:这都是啥啥啥???这一个截图我啥也看不出来呀? 仔细一看,好像似曾相识,这不是《MySQL 45 讲》里面的内容么? 什么是 next-key lockA
2022-06-01

MySQL中next-key lock加锁范围的示例分析

这篇文章主要介绍MySQL中next-key lock加锁范围的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言某天,突然被问到 MySQL 的 next-key lock,我瞬间的反应就是:这都是啥啥啥?
2023-06-15

mysql死锁(dead lock)与锁等待(lock wait)的出现解决

目录死锁(dead lock)前台报错事后追查innodb statuserror.log锁等待(lock wait)1个参数innodb_lock_wait_timeout怎么处理级联锁或大量锁很多人都分不清死锁和锁等待的区别,也有不同I
mysql死锁(dead lock)与锁等待(lock wait)的出现解决
2024-09-09

python中的多线程锁lock=threading.Lock()如何使用

这篇文章主要介绍“python中的多线程锁lock=threading.Lock()如何使用”,在日常操作中,相信很多人在python中的多线程锁lock=threading.Lock()如何使用问题上存在疑惑,小编查阅了各式资料,整理出简
2023-07-02

怎么在java中使用lock获取锁

这篇文章给大家介绍怎么在java中使用lock获取锁,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的
2023-06-14

Java多线程中Lock锁如何使用

这篇文章主要介绍“Java多线程中Lock锁如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java多线程中Lock锁如何使用”文章能帮助大家解决问题。Lock基本使用Lock它是java.u
2023-07-02

mysql间隙锁的应用

什么是间隙锁在 mysql 中,间隙锁是一种特殊的锁,用于处理并发操作。当一个事务执行查询时,如果该查询涉及到一行数据的一个范围(而不是一行的具体值),MySQL 就会为这个范围加上间隙锁。例如,如果一个事务执行下面这条查询:SELE
2023-01-05

编程热搜

目录