数据库锁 for update
来源:互联网 发布:自制手机壁纸软件 编辑:程序博客网 时间:2024/05/28 23:11
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 ,人工删除锁记录。那边被影响的记录就可以修改了。
MySQL中select * for update锁表的范围
MySQL中select * for update锁表的问题
由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table
Lock (将整个资料表单给锁住)。 举个例子: 假设有个表单products ,里面有id跟name二个栏位,id是主键。
例1: (明确指定主键,并且有此笔资料,row lock)
SELECT * FROM products WHERE id='3' FOR UPDATE;
SELECT * FROM products WHERE id='3' and type=1 FOR UPDATE;
例2: (明确指定主键,若查无此笔资料,无lock)
SELECT * FROM products WHERE id='-1' FOR UPDATE;
例2: (无主键,table lock)
SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
例3: (主键不明确,table lock)
SELECT * FROM products WHERE id<>'3' FOR UPDATE;
例4: (主键不明确,table lock)
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
注1: FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。
注2: 要测试锁定的状况,可以利用MySQL的Command Mode ,开二个视窗来做测试。
在MySql 5.0中测试确实是这样的
另外:MyAsim 只支持表级锁,InnerDB支持行级锁 添加了(行级锁/表级锁)锁的数据不能被其它事务再锁定,也不被其它事务修改
(修改、删除) 。是表级锁时,不管是否查询到记录,都会锁定表。
- 数据库锁 for update
- mysql 数据库 for update 锁
- 数据库 for update 锁表的问题
- 多线程同步方法<一>数据库悲观锁(for update)
- 数据库:Mysql中“select ... for update”排他锁分析
- for update 数据库锁机制(mysql下测试)
- 数据库:Mysql中“select ... for update”排他锁分析
- 数据库:Mysql中“select ... for update”排他锁分析
- 数据库oracle for update of 和for update的区别
- 数据库 oracle for update of 和 for update区别
- Oracle数据库:for update 和for update of
- 数据库oracle for update of和for update区别
- 数据库 for update of 和 for update区别。
- 数据库 oracle for update of 和 for update区别【经典】
- 数据库 oracle for update of 和 for update区别【经典】
- 数据库 oracle for update of 和 for update区别
- 数据库 oracle for update of 和 for update区别
- 数据库oracle for update of和for update区别
- Mac OS X设置PATH环境变量
- dump文件里的数值转换的逆函数
- iOS图片拉伸技巧
- 【Android UI】状态栏和toolbar颜色一致
- 数据字典(14)
- 数据库锁 for update
- 视图实现圆角效果的三种方法及比较
- 如何选择机器学习算法
- Android-->改造Xlistview完成自动下拉刷新(类似网易)效果
- HDU 2141 Can you find it?(二分查找)
- 动态性能视图(15)
- activity fragment 生命周期
- spring中bean的作用域
- 点滴开始