牛刀小试mysql-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1931821
  • 博文数量: 176
  • 博客积分: 1857
  • 博客等级: 上尉
  • 技术积分: 2729
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-14 22:55
个人简介

吾生有涯,而知无涯,适当止学.循序渐进,步步提升 talk is cheap, show me the code.

文章分类

全部博文(176)

文章存档

2019年(1)

2018年(14)

2017年(20)

2016年(31)

2015年(15)

2014年(5)

2013年(10)

2012年(80)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: mysql/postgresql

2018-05-19 17:44:47

innodb继承了标准的行级别的锁机制,提供了两种类型的锁。

*.共享锁(s)    允许一个事务获得只读一行的锁。
*.排他锁(x)    允许一个事务获得修改或者删除一行的锁。

假设一个事务t1在某一行上面获得一个s锁,那么事务t2可以获得对这一行的s锁,但是不能获得这
一行的x锁,需要等待。

假设一个事务t1在某一行上面获得一个x锁,那么事务t2既不能获得对这一行的s锁,也不能获得对这一行的x锁。都需要等待。

共享锁和排他锁的语句如下:

共享锁:select * from table_name where ... lock in share mode

排他锁:select * from table_name where ... for update


例子:
mysql数据准备:

create database ztest;

use ztest;

create table zstudent(stu_id int not null auto_increment ,stu_name varchar(20),sex char(1),primary key (`stu_id`));

插入数据:

insert into zstudent(stu_name,sex) values('lzh','m');

insert into zstudent(stu_name,sex) values('zsd','m');

insert into zstudent(stu_name,sex) values('hk','m');

insert into zstudent(stu_name,sex) values('zc','m');

insert into zstudent(stu_name,sex) values('yf','m');


innodb共享锁的例子

session 1
set autocommit=0;

1)使用share mode stu_id=1的这一行加入共享锁(s).

(root@localhost) [ztest]> select * from zstudent where stu_id=1 lock in share mode;

-------- ------------- ------

| stu_id | stu_name | sex  |

-------- ------------- ------

|      1   |  zh          | m     |

-------- ------------- ------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(4)事务1执行commit语句,释放共享锁

(root@localhost) [ztest]> commit;

 

session 2

set autocommit=0;

 

 

 

 

 

 

 

 

 

 

 

2)事务2可以获得stu_id=1这一行的共享锁(s)

(root@localhost) [ztest]> select * from zstudent where stu_id=1 lock in share mode;

-------- ------------- ------

| stu_id | stu_name | sex  |

-------- ------------- ------

|      1   |  zh          | m     |

-------- ------------- ------

 

3)事务2却无法获得stu_id=1这一行的排他锁(x)。一直等待事务1s锁释放。

(root@localhost) [ztest]> update zstudent set stu_name='zsd2' where stu_id=1;

上述语句一直在等待,没有输出结果

备注:

如果等待时间过长,会出现如下错误;

error 1205 (hy000): lock wait timeout exceeded; try restarting transaction

 

 

 

(5)事务2获得排他锁,出现如下执行结果:

query ok, 0 rows affected (2.99 sec)

rows matched: 1  changed: 0  warnings: 0

最后执行commit,释放排他锁。




阅读(2068) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图