InnoDB中的select..forupdate语句
程序员文章站
2022-04-12 21:20:41
InnoDB中的select .. for update语句:
1)select .. for update语句仅适用于InnoDB
2)select .. for updat...
InnoDB中的select .. for update语句: 1)select .. for update语句仅适用于InnoDB 2)select .. for update语句必须在事务中才能生效。 3)在执行事务中的select .. for update语句时,MySQL会对查询结果集中的每行数据都添加排他锁(行锁、表锁),其它线程对锁定行的 更新、删除、select .. for update查询 这3种操作都会被阻塞,一般的select语句不会被阻塞。 4)查看自动提交是否开启(1表示开启,0表示关闭,默认开启): select @@autocommit 排它锁的选择: 若where条件中明确指定了主键,且该行数据存在,则只锁定该行,故排它锁为行锁(row lock)。 若where条件中明确指定了主键,但是该行数据不存在,则不会加锁。 若where条件中明确指定了索引,且该行数据存在,则只锁定该行,故排它锁为行锁(row lock)。 若where条件中明确指定了索引,但是该行数据不存在,则不会加锁。 若where条件中未明确指定主键或索引,则会锁定全表,故排它锁为表锁(table lock)。 注:未明确指定 即 未指定(主键/索引) 或 指定的是(主键/索引)的范围 eg: # 只锁定message_id为1的行 set autocommit=0; begin; select * from t_message where message_id=1 for update; # message_id为主键 commit; # 锁定全表 set autocommit=0; begin; select * from t_message where message_id>1 for update; # message_id为主键 commit; # 锁定全表 set autocommit=0; begin; select * from t_message where type='good' for update; # good非索引列 commit; 其它线程因为等待(排它锁)超时而报错: update t_message set title='asdf' where message_id=1; [Err] 1205 - Lock wait timeout exceeded; try restarting transaction
上一篇: 正则表达式简介(12)
下一篇: 摄影师如何形成自己的个人风格?
推荐阅读
-
请问关于PHP中关联多表相关字段,并做分页处理的SQL语句写法
-
PHP施行sql语句失败,但同样的语句在MYSQL中可以执行
-
用SQL语句查找Access中某表是否存在的小技巧
-
MySQ中基本语法与语句的介绍
-
MySQL中InnoDB的Memcached插件的使用教程_MySQL
-
mysql中order by 语句的用法 索引优化
-
如何在源码中找出sql语句的位置呢
-
织梦{ dede:listsql sql } 标签中怎么给sql 语句中的条件传入栏目ID的值,跪求大神指点....
-
请教新建字段时候语句`aaa` varchar(11) NOT NULL,中的NOT NULL有什么作用呢
-
关于Oracle的在Eclipse中操作的命令语句