Mysql.lock

#mysql锁mysql

##行锁争夺sql

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锁)session

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

事务

select 默认是共享锁code

#查看自动提交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;
相关文章
相关标签/搜索