mysql 锁
Lock table有两种模式
lock tables table_name read [or write];
test1:
session 1:
lock tables tmp_xf_lock;
1. 可以查询
2. dml 报:ERROR 1099 (HY000): Table 'tmp_xf_lock' was locked with a READ lock and can't be updated
session 2:
1. 可以查询
2. dml: 等待,直到session 1 unlock tables 或者超时
test2:
session1:
lock tables tmp_xf_lock write;
1. 可以查询
2. 可以dml :insert into tmp_xf_lock values(8,8);
Query OK, 1 row affected (0.00 sec)
session2:
1. 不可以查询
2,不可以dml ,都是等待状态
这些文档里描写的很清楚,所以当只是想停止对表加锁,不让表表数据再发生变更,那么用 read。如果只是想让自己可以更改数据,其他用户不能查询也不能变更数据,那么用 wirte(阻塞了其他线程的读写,有点狠,都不让读了)。 用处各不相同,注意好选择。 看字面意思的 lock write可能会产生误解。
注意:FLUSH TABLES WITH READ LOCK; 这样可以锁住所有表
Lock tables,主要应用于非innodb类型的表的事务操作
如果你的表都是innodb,就不需要lock table了。当事务与lock tables一起使有时,需要注意以下内容:
(1)Start transaction或者begin运行后,如果之前运行了lock tables ….,会自动解锁,同时也会自动提交前面有开始的事务
(2)commit和rollback只对事务有影响,不会对lock tables产生解锁作用。
(3)lock tables运行后,如果前面运行了start transaction,这里的lock tables就带有commit作用,自动事务提交---------lock table 与 事务不能共存
(4)lock tables与事务混用时必须这样:(其实这里相当于模拟了一个事务(innodb 没有必要这样做))
set autocommit = 0;
lock tables 表1 write,表2 read ….;
。。。一些update,delete,insert等;
commit;
unlock tables;
Lock tables 是表锁 事务开始的时候一般是行锁 有时间也是表锁
A端——使用mySQL命令行
B端——使用phpMyAdmin
数据表:create table t_role_user(id int not null auto_crement,rid int,uid int,primary key(id));
在A端运行:
Start transaction;
update t_role_user set rid=99 where id=1;
接着在B端
Update t_role_user set rid=100 where id=2;
B端正常完成,说明此时表没有被锁
接着在B端
Delete from t_role_user where id=1;
B端的phpMyAdmin页面运行中,进程在等待A端事务完成,因为id=1这行被锁定了
接着在A端commit
然后再看B端发现进程完成了,成功删除id=1表了,这是因为A端的事务完成了,id=1的行解锁了,B端才可以继续
OK,我们删除t_role_user表的id字段,只留rid与uid两个字段,再测试:
A端
Start transaction;
update t_role_user set rid=12 where rid=1;
接着在B端
Update t_role_user set rid=100 where rid=2;
B端的phpMyAdmin页面运行中,此时因为update没指定主键,虽然B端更新的行不是A端事务操作的行,但t_role_user整个表还是被锁住了,所以B端必须等A端事务完成了才可以继续。
接着在A端Commit
再回头看B端,发现sql执行完毕了。
事务中update,delete指定主键可以帮助innodb锁定行而不需要锁定整个表,我再测试对rid与uid建立联合的唯一索引,如果在事务中update或delete有指定rid=? And uid=?时,innodb也只会锁行不会锁表,说明唯一索引也可以帮助innodb锁行不锁表
事务之间的锁定 分的情况:
1:一个用户 开始事务 另一个没有
2:一个用户 开始事务 另一个也开始事务
不论是一还是二的情况 都满足上边的
下边介绍一下第2中的几个不同情形:
事务的分离水平(就是锁)有以下三种;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
当用户设置这个级别的话 没有任何限制 就相当于没有锁一样
Select 的时候没有限制 只要 那个开启事务一端 dml 语句 这边查看随时变化
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
当用户设置这个级别的话 类似于 一个开启事务 一个没有的情况
Select 的时候 只能查到 没有commit 之前的
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
这个必须两端都设置成这个级别才能开到效果,只要开启事务 用的了dml语句
另一端select 处于等待状态 直到 commit
实验截图:
一端开启事务一端没有
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
这个与一端开启 一端没有开启效果一样
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
先查询一下看看
这三种级别 说着有点模糊 自己做个实验看看就明白了
可以用下边的代码做实验
CREATE TABLE `customer`(
`mid` CHAR(5) PRIMARY KEY NOT NULL,
`nam` VARCHAR(20) NOT NULL DEFAULT '',
`birth` DATE NOT NULL DEFAULT '00-00-00',
`sex` CHAR(1) NOT NULL DEFAULT '0'
) engine=innodb
INSERT INTO customer VALUES('G0001','杜意意','1975-04-18','0');
INSERT INTO customer VALUES('G0002','李玉枝','1980-09-09','1');
INSERT INTO customer VALUES('H0001','李如','1975-04-18','0');
INSERT INTO customer VALUES('N0001','小小','1980-11-23','1');
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
begin;
SELECT mid,nam FROM customer WHERE mid='G0001';
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
begin;
UPDATE customer set nam='周同' WHERE mid='G0001';
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
begin;
INSERT INTO customer VALUES('T0001','王二','1980-11-23','1');
mysql 锁的更多相关文章
- mysql锁
锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...
- Mysql锁初步
存储引擎 要了解mysql的锁,就要先从存储引擎说起. 常用存储引擎列表如下图所示: 最常使用的两种存储引擎: Myisam是Mysql的默认存储引擎.当create创建新表时,未指定新表的存储引擎时 ...
- mysql锁表机制及相关优化
(该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...
- MySQL锁系列3 MDL锁
http://www.cnblogs.com/xpchild/p/3790139.html MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...
- 01 MySQL锁概述
锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有 ...
- Mysql锁机制介绍
Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...
- MySQL锁等待分析【2】
MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ...
- MySQL锁与MVCC
--MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ...
- MySQL锁总结
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/78 MySQL 锁基础 参考了何登成老师文章的结构MySQL 加 ...
- Mysql锁机制--并发事务带来的更新丢失问题
Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ...
随机推荐
- IOS项目自动构建
# Sets the target folders and the final framework product. # 如果工程名称和Framework的Target名称不一样的话,要自定义FMKN ...
- 【HTML5】video视频
当前,video 元素支持三种视频格式: 格式 IE Firefox Opera Chrome Safari Ogg No 3.5+ 10.5+ 5.0+ No MPEG 4 9.0+ No No 5 ...
- 启动mysql出现了error the server quit without updating pid file (/var/lib/mysql/localhost.localdomain.pid)
原来是我的mysql日志太多,所以去/data/log/mysql目录(这个目录是从/etc/my.cnf中的log-error确定的)下删除了 rm -rf mysql_binary_log.*的日 ...
- 在JavaScript中,this关键字指什么?
指向对象.window.方法. 例子1 function a(){//当前调用栈是a,因此a的调用位置是全局作用域 console.log('a'); b();// b的调用位置 } function ...
- http://www.111cn.net/jsp/Jsp-Servlet/45158.htm
http://www.111cn.net/jsp/Jsp-Servlet/45158.htm
- Extjs3.3 + swfUpload2.2 实现多文件上传组件
[该上传组件已经停止更新,该上传组件已经在项目中使用.在使用过程中如果发现bug请大家回复此贴.2011-02-27] 主要是为了用swfUpload实现上传,为了新鲜好玩. 理解swfUpload可 ...
- 【壁纸自动换】自动下载、更换壁纸(Bing壁纸)--XinBSBingWallPaper[2.7更新]
XinBSBingWallPaper主要功能: 1.支持自动下载Bing壁纸.Netbian壁纸.美国国家地理杂志图片. 2.自动搜索.下载多国Bing首页壁纸. 3.支持定时自动更换桌面壁纸. 4. ...
- Win 8 App开发框架解析
开发前准备: Windows 8 RTM MSDN订阅用户下载地址: https://msdn.microsoft.com/zh-cn/subscriptions/securedownloads/hh ...
- HDU 4630 No Pain No Game(树状数组)
题目链接 看的别人的题解,离线之后,按r排序,枚举1-n,利用pre[j],存上次j的倍数出现的位置,树状数组里统计的当前位置到最后的最大值,树状数组是求区间最值其实应该很麻烦的,但是此题用法只是求到 ...
- java中的Integer的toBinaryString()方法
在一次面试的过程中,遇到过这样的题目,题目的大概意思是:让写出Integer类中的toBinaryString()方法 也就是说,把Integer转换为Binary的过程写出来 但是我蒙的,在查了JD ...