您现在的位置是:网站首页>Mysql>INNODB的两种行锁Mysql

INNODB的两种行锁

adminMysql13人已围观

1)共享锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
    ( Select * from table_name where ......lock in share mode)
2)排他锁:允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和  排他写锁。(select * from table_name where.....for update)

 为了允许行锁和表锁共存,实现多粒度锁机制;同时还有两种内部使用的意向锁(都是表锁),分别为意向共享锁和意向排他锁。
    InnoDB行锁是通过给索引项加锁来实现的,即只有通过索引条件检索数据,InnoDB才使用行级锁,否则将使用表锁!


例1: (明确指定主键,并且有此笔资料,row lock)
复制代码代码如下:
SELECT * FROM products WHERE id='3' FOR UPDATE;
SELECT * FROM products WHERE id='3' and type=1 FOR UPDATE;
例2: (明确指定主键,若查无此笔资料,无lock)
复制代码代码如下:
SELECT * FROM products WHERE id='-1' FOR UPDATE;
例3: (无主键,table lock)
复制代码代码如下:
SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
例4: (主键不明确,table lock)
复制代码代码如下:
SELECT * FROM products WHERE id<>'3' FOR UPDATE;
例5: (主键不明确,table lock)
复制代码代码如下:
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
注1: FOR UPDATE仅适用于InnoDB,且必须在交易区块(BEGIN/COMMIT)中才能生效。
注2: 要测试锁定的状况,可以利用MySQL的Command Mode ,开二个视窗来做测试。


共享锁【S锁】
又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
排他锁【X锁】
又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

站点信息

  • 建站时间:2019-3-10
  • 网站程序:ThinkPHP PHP MYsql
  • 路由说明:全站静态化+api
  • 统计数据百度统计
  • 登陆方式:githua授权登陆
  • 个人邮箱:2584496361@qq.com
  • 个人Q Q2584496361
  • 业务咨询:有需要建站朋友欢迎咨询