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 加锁问题的更多相关文章

  1. Mysql加锁过程详解

    1.背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文, ...

  2. MySQL 加锁处理分析

    1    背景    1 1.1    MVCC:Snapshot Read vs Current Read    2 1.2    Cluster Index:聚簇索引    3 1.3    2P ...

  3. MySQL 加锁处理分析 转

    MySQL 加锁处理分析  转 http://hedengcheng.com/?p=771 十二 13th, 2013 发表评论 | Trackback   1    背景    1 1.1    M ...

  4. 转载-MySQL 加锁处理分析

    MySQL 加锁处理分析 发表于 2013 年 12 月 13 日 由 hedengcheng 1    背景    1 1.1    MVCC:Snapshot Read vs Current Re ...

  5. MySQL加锁分析

    参考:MySQL 加锁处理分析.该文已经讲的很详尽了,也易懂,下面仅仅是个人做的总结. 一. 背景 1.1 隔离级别 1.2 加锁过程 逐条处理,逐条加锁. 1.3 两阶段锁2PL 1.4 gap锁 ...

  6. MySQL 加锁处理分析-转载

    来自何登成的技术博客     1.1    MVCC:Snapshot Read vs Current Read    2 1.2    Cluster Index:聚簇索引    3 1.3     ...

  7. Mysql加锁过程详解(8)-理解innodb的锁(record,gap,Next-Key lock)

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  8. Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  9. Mysql加锁过程详解(1)-基本知识

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  10. Mysql加锁过程详解(2)-关于mysql 幻读理解

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

随机推荐

  1. LINQ 查询集合总的重复项

                      select new FMDS_FarmPlotNewInfo                   {                        FarmPlo ...

  2. Linux安全审计命令

    安全审计 数据分析 capinfos xxx.pcap 产看数据包基本信息 日志分析 who /var/log/wtmp #查看登录用户信息 哈希校验 sha265 文件名 md5sum 文件名 &g ...

  3. JS之链式运动,及任意值运动框架,包括透明度的改变

    链式运动,顾名思义,一环扣一环,即执行完一个事件后,再接着执行下一个事件,在参数上面动手脚,将下一个要执行的函数名作为一个参数,即利用到回掉函数,下面代码中出现的fn,即回掉函数, function ...

  4. 评测:VPS推荐digitalocean和Vultr和Linode

    美国vps推荐三家,分别是digitalocean.vultr和linode,拥有很高的性价比,中国访问速度快.我是上面三家的早期用户,并且一直使用至今,积累了不少使用经验. DigitalOcean ...

  5. webservice整合spring

    接口HelloWorld需要添加webservice注解 package com.cs.webservice; import java.util.List; import javax.jws.WebP ...

  6. IMAGE服务器软件配置

    NFS: vim /etc/exports /bak/www/www.xxxl.com/public/ 10.20.10.0/24(rw,sync,no_root_squash)/bak/www/ww ...

  7. 2015 ACM/ICPC Asia Regional Hefei Online

    1001 Monitor the Alpacas 1002 The Relationship in Club 1003 Difference of Clustering 两边离散化.暴力扫C就过了. ...

  8. ThinkPHP框架基础

    ThinkPHP 一.php框架基础介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维 ...

  9. POJ 1696 Space Ant 极角排序(叉积的应用)

    题目大意:给出n个点的编号和坐标,按逆时针方向连接着n个点,按连接的先后顺序输出每个点的编号. 题目思路:Cross(a,b)表示a,b的叉积,若小于0:a在b的逆时针方向,若大于0a在b的顺时针方向 ...

  10. PHP7编译错误:php编译undefined reference to `libiconv 错误

    ext/gd/libgd/.libs/gdkanji.o: In function `do_convert’: /root/php-5.2.12/ext/gd/libgd/gdkanji.c:350: ...