• mysql 乐观锁、悲观锁、共享锁,排它锁


    mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。

    共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

    排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

    对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制

    乐观锁:通过程序控制版本号实现;

    悲观锁:共享锁、排它锁

    #lock in share mode 共享锁
    SELECT * FROM a lock in share mode;
    #for update 加排它锁 未提交;开共享锁和排他锁都会处于阻塞状态,如果排它锁commit提交会自动释放
    BEGIN;
    SELECT * FROM a WHERE id=1 for UPDATE;
    COMMIT;

    #加了共享锁的数据记录可以加共享锁或者不加锁
    BEGIN;
    SELECT * FROM a WHERE id=1 lock in share MODE;

    #mysql INNODB 引擎 默认对 insert update delete自动加排它锁
    #for example
    BEGIN;
    UPDATE a set name='测试排它锁' WHERE id='1';

    #执行以下sql阻塞
    BEGIN;
    SELECT * FROM a WHERE id=1 lock in share MODE;

  • 相关阅读:
    题解 CF171G 【Mysterious numbers
    题解 P1157 【组合的输出】
    题解 P3955 【图书管理员】
    题解 P2036 【Perket】
    题解 CF837A 【Text Volume】
    题解 CF791A 【Bear and Big Brother】
    题解 CF747A 【Display Size】
    题解 P1332 【血色先锋队】
    题解 P2660 【zzc 种田】
    题解 P4470 【[BJWC2018]售票】
  • 原文地址:https://www.cnblogs.com/coderdxj/p/9554338.html
Copyright © 2020-2023  润新知