吾生有涯,而知无涯,适当止学.循序渐进,步步提升 talk is cheap, show me the code.
分类: 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、
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 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)。一直等待事务1的s锁释放。 (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,释放排他锁。 |