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

  1. mysql锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  2. Mysql锁初步

    存储引擎 要了解mysql的锁,就要先从存储引擎说起. 常用存储引擎列表如下图所示: 最常使用的两种存储引擎: Myisam是Mysql的默认存储引擎.当create创建新表时,未指定新表的存储引擎时 ...

  3. mysql锁表机制及相关优化

    (该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...

  4. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

  5. 01 MySQL锁概述

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有 ...

  6. Mysql锁机制介绍

    Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  7. MySQL锁等待分析【2】

    MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ...

  8. MySQL锁与MVCC

    --MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ...

  9. MySQL锁总结

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/78 MySQL 锁基础 参考了何登成老师文章的结构MySQL 加 ...

  10. Mysql锁机制--并发事务带来的更新丢失问题

    Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ...

随机推荐

  1. 使用awk排除第一行和第二行的数据

    因为linux shell命令行输出的前面几行一般是指导或是格式字段说明, 而不是实现的数据,所以在作过滤时,一般需要排除前面的几行. 现需要找出指定机器开放的所有端口. 我遇到的情况是要排除前面两行 ...

  2. node.js简单的页面输出

    在node.js基本上没有兼容问题(如果你不是从早期的node.js玩起来),而且原生对象又加了这么多扩展,再加上node.js自带的库,每个模块都提供了花样繁多的API,如果还嫌不够,github上 ...

  3. 区间dp总结

    poj 1141 Brackets Sequence 基础的区间dp题,注意dp边缘的初始化,以及递归过程中的边界 poj 2955 Brackets 依旧注意初始化,水题 hdu 4745 Two ...

  4. Visual Studio从此走入非Windows程序猿家

    (此文章同时发表在本人微信公众号"dotNET每日精华文章") 在Build 2015大会上,微软放了很多大招,其中一个让普通(不管是微软生态还是非微软生态的)程序猿都密切关注的就 ...

  5. Distinct和Group by去除重复字段记录

    重复记录 有两个意义,一是完全重复的记录,也即所有字段均重复的记录 二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略. 1.对于第一种重复,比较容易解决,使用 s ...

  6. SQL分布式查询、跨数据库查询

    --[方法1]连接服务器方法 --step1 创建链接服务器  exec sp_addlinkedserver     'srv_lnk','','SQLOLEDB', 'ip地址'  exec sp ...

  7. SQL事务的使用

    在 SQL Server 中数据库事务处理是个重要的概念,也稍微有些不容易理解,很多 SQL 初学者编写的事务处理代码存往往存在漏洞,本文介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正 ...

  8. Hark的数据结构与算法练习之插入排序

    算法说明: 先是拿语言进行一下描述: 假如是做降序排序,那么从头开始扫描每个数字,使每个数字与它前面的若干数字进行比较,直接找到小于当前数字a(当前数字以a代替)的数字b(小于a的数字以b代替). 然 ...

  9. Android 编程下如何调整 SwipeRefreshLayout 的下拉刷新距离

    SwipeRefreshLayout 的下拉刷新距离比较短,并且也没有提供设置下拉距离的 API,但是看 SwipeRefreshLayout 的源码,会发现有一个内部变量 mDistanceToTr ...

  10. flst与fitem命令是这么用的

    k,94,75.69947,44.09817,-40 k,95,50.9349,44.01963,-40 k,96,37.83799,45.04814,-40 k,97,15.1304,48.2934 ...