数据库锁 for update
2015-07-30 11:12
465 查看
首先:发出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条件的列是索引,那么执行的是行锁,只锁受影响的记录,其他记录照样可以执行正常的读写。
最后同样的 执行 kill 6 ,人工删除锁记录。那边被影响的记录就可以修改了。
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条件的列是索引,那么执行的是行锁,只锁受影响的记录,其他记录照样可以执行正常的读写。
最后同样的 执行 kill 6 ,人工删除锁记录。那边被影响的记录就可以修改了。
相关文章推荐
- 【mongodb系统学习之十一】mongodb删除数据
- 数据库管理2(13)
- 数据库管理(12)
- 数据库管理(12)
- Another MySQL daemon already running with the same unix socket
- sql函数的使用-日期函数(11)
- 2 数据库基本操作及SQL
- sql函数的使用(10)
- oracle事务管理(9)
- oracle多表查询(7)
- Mysql配置
- 调用MYSQL存储过程实例
- 使用WEBStorage+JSON做简易数据库
- MySQL双主架构方案
- Message: mysql_get_server_info(): The mysql extension is deprecated and ……
- Message: mysql_get_server_info(): The mysql extension is deprecated and ……
- SQL - CHECK约束
- sql合并字段
- 转---sqlserver 复制---订阅与发布(概念介绍比较好)
- ORACLE directory 目录--转载