Mysql.lock

#mysql锁

##行锁争夺

show status like 'innodb_row_lock%';

InnoDB的行锁模式及加锁方法

  • innoDB实现了以下两种类型的行锁。
  1. 锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
  2. 锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。 另外,为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。
  3. 共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
  4. 排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
  • 如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。 意向锁是InnoDB自动加的,不需用户干预。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁;
#共享锁
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
#排他锁
SELECT * FROM table_name WHERE ... FOR UPDATE
  • 用SELECT ... IN SHARE MODE获得共享锁,主要用在需要数据依存关系时来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者DELETE操作。但是如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用SELECT... FOR UPDATE方式获得排他锁。

##InnoDB行锁实现方式

  • noDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
  • MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突
#关闭自动提交,2个session,查询2行,也会冲突,第二条查询会等待
select * from table where id = 1 for update;
select * from table where id = 2 for update;

##间隙锁(Next-Key锁)

  • 们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。 举例来说,假如emp表中只有101条记录,其empid的值分别是 1,2,...,100,101,下面的SQL:
Select * from  emp where empid > 100 for update;

事务

select 默认是共享锁

#查看自动提交0手动,1自动
select @autocommit
#手动设置是否自动
set autocommit;
#提交
commit;
#查看mysql版本
SELECT @@version;
#查看当前事务隔离级别
select @@tx_isolation;
#全局事务隔离级别
select @@global.tx_isolation;
#设置事务隔离级别,也用通过mysql.ini设置
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
#查看当前正在运行的查询 或者等待休眠中的查询
show processlist;
#mysql5.5之后,information_schema数据库加了三个关于锁的表。
#innodb_trx ## 当前运行的所有事务
#innodb_locks ## 当前出现的锁
#innodb_lock_waits ## 锁等待的对应关系
#查看innodb引擎状态,锁,事务,各种信息
show engine innodb status
#查看锁等待时间,设置my.ini innodb_lock_wait_timeout值
SELECT @@innodb_lock_wait_timeout;

转载于:https://my.oschina.net/u/1432304/blog/913427

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值