MySql 加锁问题
1、设置非自动提交 set autocommit=0; 这时候 for update才会起作用
2、一般用法 set autocommit=0; for update(加锁) ; commit/rollback; set autocommit=1;
首先看一下,set autocommit=0 后,执行哪些语句会自动加锁,加的是什么锁?
测试环境:5.6.16 innnoDB引擎 非自动提交方式(即 set autocommit=0;)
测试过程:执行 select * from w_help ;这个语句,并不会加锁 其他命令窗口一样可以增删改查;测试代码如下
DELIMITER $$ DROP PROCEDURE IF EXISTS `test_release`.`test_Lock`$$ CREATE DEFINER=`encysys48`@`%` PROCEDURE `test_Lock`(IN v_id VARCHAR(20),IN v_flag VARCHAR(10))
BEGIN
set autocommit=0;
select t.flag from test_lock t where t.hf_serial = v_id for update;
/*update test_lock t
set t.flag = v_flag
where t.hf_serial = v_id;*/
-- insert into w_help(char_content) values ('aaaaaaaaaaaaaaaaaaaa') for update;
-- delete from w_help where w_help.id = '451';
select * from w_help ;
select sleep(v_flag);
commit;
set autocommit=1;
END$$ DELIMITER ;
存储过程 加锁后SLEEP
call test_Lock(1,10) -- 调用存储过程
在释放锁之前,下面的语句都是可以执行的,说明表并没有加锁
select * from w_help;
insert w_help(char_content) values("abcd");
update w_help t
set t.char_content = ''
where t.id = "458";
delete from w_help -- where w_help.id = '458'
执行 insert into w_help(char_content) values ('aaaaaaaaaaaaaaaaaaaa') ;这个语句,只会给一行加锁,(值得一提的是 这个语句后面不能跟 for update 否则会报错,不知道是我写的语法问题,还是根本就不能加) insert into w_help(char_content) values ('aaaaaaaaaaaaaaaaaaaa') for update; 就会报错;
其他事务语句执行情况如下:
select * from w_help; -- 可以执行
insert w_help(char_content) values("abcd"); -- 可以执行
update w_help t
set t.char_content = ''
where t.id = "464"; -- 可以执行
delete from w_help where w_help.id = ''; -- 可以执行
delete from w_help -- 不能执行会等待锁释放后执行
执行 update w_help t
set t.char_content = v_flag
where t.id ="476"; 这个语句,只会给一行加锁,(前提是指明了主键)
其他事务语句执行情况如下:
select * from w_help; -- 可以执行
insert w_help(char_content) values("abcd"); -- 可以执行
update w_help t
set t.char_content = ''
where t.id = "479"; -- 可以执行
delete from w_help where w_help.id = ''; -- 可以执行
delete from w_help -- 不能执行
如果不指明主键 则会锁住整个表,其他事务语句执行情况如下:
select * from w_help; -- 可以执行
insert w_help(char_content) values("abcd"); -- 可以执行并且不会被update
update w_help t
set t.char_content = ''
where t.id = "489"; -- 不能执行 等待锁被释放后继续执行
delete from w_help where w_help.id = ''; -- 不能执行 等待锁被释放后继续执行
delete from w_help -- 不能执行 等待锁被释放后继续执行
执行 delete from w_help where w_help.id = '490';这个语句 产生行级锁,
其他事务语句执行情况如下:
select * from w_help; -- 可以执行
insert w_help(char_content) values("abcd"); -- 可以执行
update w_help t
set t.char_content = ''
where t.id = "490"; -- 被锁定的唯一一行 不能执行
delete from w_help where w_help.id = ''; -- 不是被锁定的那一行,可以执行
delete from w_help -- 不能执行
还有一个奇葩的问题 select * from w_help for update; 并不能限制其他线程读取数据;可以限制其他线程加锁(即其他线程便不能加锁了)
这样的的话怎么防止读脏数据就是个问题了;不过我是在两个连接中测试的,即一个连接执行此语句,另一个连接仍然可以读数据,但是不可以修改!
所以,如果修改数据,select 时一定要 for update,否则就会有致命错误!
最后附上测试用的乱七八糟的代码,不值得看,只是做个备份而已,说不定哪时会用到;
DELIMITER $$ DROP PROCEDURE IF EXISTS `test_release`.`test_Lock`$$ CREATE DEFINER=`encysys48`@`%` PROCEDURE `test_Lock`(IN v_id VARCHAR(20),IN v_flag VARCHAR(10))
BEGIN
set autocommit=0;
select t.flag from test_lock t where t.hf_serial = v_id for update;
/*update w_help t
set t.char_content = v_flag ;
-- where t.id ="476";
-- insert into w_help(char_content) values ('aaaaaaaaaaaaaaaaaaaa') ;*/
delete from w_help where w_help.id = '';
-- select * from w_help ;
select sleep(v_flag);
commit;
set autocommit=1;
END$$ DELIMITER ; --
select * from w_help; -- 可以执行
insert w_help(char_content) values("abcd"); -- 可以执行
update w_help t
set t.char_content = ''
where t.id = "490"; -- 被锁定的唯一一行 不能执行
delete from w_help where w_help.id = ''; -- 不是同一行,可以执行
delete from w_help -- 不能执行
update w_help t
set t.char_content = "666" where t.id = "489";
乱七八糟
MySql 加锁问题的更多相关文章
- Mysql加锁过程详解
1.背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文, ...
- MySQL 加锁处理分析
1 背景 1 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 2P ...
- MySQL 加锁处理分析 转
MySQL 加锁处理分析 转 http://hedengcheng.com/?p=771 十二 13th, 2013 发表评论 | Trackback 1 背景 1 1.1 M ...
- 转载-MySQL 加锁处理分析
MySQL 加锁处理分析 发表于 2013 年 12 月 13 日 由 hedengcheng 1 背景 1 1.1 MVCC:Snapshot Read vs Current Re ...
- MySQL加锁分析
参考:MySQL 加锁处理分析.该文已经讲的很详尽了,也易懂,下面仅仅是个人做的总结. 一. 背景 1.1 隔离级别 1.2 加锁过程 逐条处理,逐条加锁. 1.3 两阶段锁2PL 1.4 gap锁 ...
- MySQL 加锁处理分析-转载
来自何登成的技术博客 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 ...
- Mysql加锁过程详解(8)-理解innodb的锁(record,gap,Next-Key lock)
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- Mysql加锁过程详解(1)-基本知识
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- Mysql加锁过程详解(2)-关于mysql 幻读理解
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
随机推荐
- ManyToMany OrderBy
有A.B表和A_B中间表,A_B中间表只有A.B表的id,想让A中的bs以date列排序: @Entity @Table(name="A") public class A impl ...
- CSS3背景颜色渐变效果
1.firefox浏览器: background-image: -moz-linear-gradient(top , #eef9fe, #d1ecff); 2.safari.chrome浏览器: ba ...
- 分页加载的Fragment
package com.z.fragment; import android.os.Bundle; import android.os.Environment; import android.supp ...
- 面试中有关C++的若干问题
面试中有关C++的若干问题 By 晴天, 2014.5.16晚 什么是多态?简要说一下C++中的多态的概念. (1)定义:多态是指相同对象收到不同消息或者不同对象收到相同消息产生不同的行为. (2)C ...
- 一个简单的IM系统(Demo附源码)-- ESFramework 4.0 快速上手(08)
前面的文章已经介绍完了基于ESFramework/ESPlus进行二次开发的所有要点,现在,我们可以开始小试牛刀了. 本文将介绍使用ESFramework的Rapid引擎开发的两个最简单的Demo,E ...
- [ An Ac a Day ^_^ ] CodeForces 680A Bear and Five Cards
这两天回家了 家里电脑太卡 调试不方便 就只能写写水题了…… #include<stdio.h> #include<iostream> #include<algorith ...
- digitalocean更换机房教程
使用本站优惠链接注册digitalocean账户,可获赠10美元digitalocean优惠码.新用户点击create,即可创建一台新的vps,10美元余额足够你使用一台512MB内存的vps长达两月 ...
- ios中判断当前手机的网络状态
typedef enum { NETWORK_TYPE_NONE= 0, NETWORK_TYPE_2G= 1, NETWORK_TYPE_3G= 2, NETWORK_TYP ...
- ios日期时间
//1.获取当前时间 -(NSString*)getCurrentTime { NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; ...
- ASP.NET中的Excel操作(NPOI方式)
代码准备: 一:实体准备 代码如下: /// <summary> /// 一个能添加到将要导出到指定行的实体类型规范 /// data:{int StartColIndex ? 0, in ...