mysql 行锁演示
来源:互联网 发布:淘宝上内裤哪个牌子好 编辑:程序博客网 时间:2024/05/23 13:42
接上一篇,演示环境一样。
我们看行锁的情况。
首先:发出sql :
set autocommit=0;
select * from role where id=1 for update;
由于innodb引擎支持行锁,因为id是主键(主键一定是索引),此时只会锁定 id=1的记录。
然后看mysql锁定记录,
发sql:SHOW PROCESSLIST;
+----+------+-----------------+---------+---------+------+-------+--------------
----+
| Id | User | Host | db | Command | Time | State | Info
|
+----+------+-----------------+---------+---------+------+-------+--------------
----+
| 6 | root | localhost:50898 | mybatis | Sleep | 8 | NULL | NULL
|
| 19 | root | localhost:51403 | mybatis | Query | 0 | NULL | SHOW PROCESSL
IST |
+----+------+-----------------+---------+---------+------+-------+--------------
----+
可以看到有一条锁表记录。
然后我们先修改其他行的记录,比如id=3记录。
发sql: update role set seat=99 where id =3;
mysql> update role set seat=99 where id =3;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
可以看到毫无影响。
如果写操作涉及到本条记录呢?
同样的,发出sql:update role set seat=90 where seat = 98;
此时会影响到 id=1,id=22条记录,而id=1已经被我们锁定了。
果然返回:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
结论:mysql innodb for update锁表如果where条件的列是索引,那么执行的是行锁,只锁受影响的记录,其他记录照样可以执行正常的读写。
我们看行锁的情况。
首先:发出sql :
set autocommit=0;
select * from role where id=1 for update;
由于innodb引擎支持行锁,因为id是主键(主键一定是索引),此时只会锁定 id=1的记录。
然后看mysql锁定记录,
发sql:SHOW PROCESSLIST;
+----+------+-----------------+---------+---------+------+-------+--------------
----+
| Id | User | Host | db | Command | Time | State | Info
|
+----+------+-----------------+---------+---------+------+-------+--------------
----+
| 6 | root | localhost:50898 | mybatis | Sleep | 8 | NULL | NULL
|
| 19 | root | localhost:51403 | mybatis | Query | 0 | NULL | SHOW PROCESSL
IST |
+----+------+-----------------+---------+---------+------+-------+--------------
----+
可以看到有一条锁表记录。
然后我们先修改其他行的记录,比如id=3记录。
发sql: update role set seat=99 where id =3;
mysql> update role set seat=99 where id =3;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
可以看到毫无影响。
如果写操作涉及到本条记录呢?
同样的,发出sql:update role set seat=90 where seat = 98;
此时会影响到 id=1,id=22条记录,而id=1已经被我们锁定了。
果然返回:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
结论:mysql innodb for update锁表如果where条件的列是索引,那么执行的是行锁,只锁受影响的记录,其他记录照样可以执行正常的读写。
0 0
- mysql 行锁演示
- mysql 表锁演示
- mysql 表锁演示
- mysql游标实例演示
- mysql游标实例演示
- mysql游标实例演示
- 疑惑?实战演示疑惑 mysql insert到底加什么锁
- 疑惑?实战演示疑惑 mysql insert到底加什么锁
- mysql分区及实例演示
- mysql分区及实例演示
- mysql分区及实例演示
- mysql函数大全及演示
- mysql分区及实例演示
- MySql性能调优(五)采用合适的锁机制之表锁的演示
- MySQL 命令行导入sql数据实战演示
- mysql两种安装方式实战演示
- MySQL函数解析及案例演示
- roacle锁的演示
- 老师不会玩网络,全国优秀也枉然
- 关于java toString方法的自动调用
- C语言指针5分钟教程
- mysql 表锁演示
- C语言实现另类“多态”的一种思路
- mysql 行锁演示
- 谷歌的一个工具,专门抓堆埙的
- Android代码开启ActionBar显示效果
- 许晓斌_Maven实战(八)——常用Maven插件介绍(下)
- 改变Activity背景颜色
- iOS自动化测试之UIAutomation
- iOS-Core-Animation之九----图层时间
- Response.AddHeader使用实例
- Java日期计算之Joda-Time