zoukankan      html  css  js  c++  java
  • mysql的几种锁

    由于对于mysql的锁机制了解的并不深入,所以翻阅了资料,整理一下自己所理解的锁。以mysql数据库的InnoDB引擎为例,因为InnoDB支持事务、行锁、表锁;且现在大部分公司使用的都是InnoDB。

    mysql锁的使用离不开事务的,所以我们先上点简单的理论,了解一下事务。

    1.数据库事务

    事务的基本要素(ACID)

    1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

    2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

    3.隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

    4.持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

    2.隔离级别

    事务隔离级别 脏读 不可重复读 幻读
    读未提交(read-uncommitted)
    不可重复读(read-committed)
    可重复读(repeatable-read)
    串行化(serializable)

     

     

     

     

     

     

    mysql默认的事务隔离级别为:可重复读(repeatable-read)

    mysql> select @@tx_isolation;
    +-----------------+
    | @@tx_isolation  |
    +-----------------+
    | REPEATABLE-READ |
    +-----------------+
    1 row in set (0.00 sec)
    

    大家可以参考这个文档,写得简单清晰:https://www.cnblogs.com/huanongying/p/7021555.html

    3.锁的分类

    共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

    排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

    意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。

    意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

    说明:

    1)共享锁和排他锁都是行锁,意向锁都是表锁,应用中我们只会使用到共享锁和排他锁,意向锁是mysql内部使用的,不需要用户干预。

    2)对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);

    对于普通SELECT语句,InnoDB不会加任何锁,事务可以通过以下语句显示给记录集加共享锁或排他锁。
    共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
    排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。

    3)InnoDB行锁是通过给索引上的索引项加锁来实现的,因此InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

    参考文档:https://www.cnblogs.com/fidelQuan/p/4549068.html

     4.事务下锁的运行

    环境配置:mysql:5.7.10 ,InnoDB引擎,事务隔离级别为:可重复读(repeatable-read)

    4.1 共享锁(S)

  • 相关阅读:
    应用层协议及ip地址划分
    请求与响应编码及jsp基本原理
    springboot注解
    springboot 快速入门
    Http协议简单解析及web请求过程
    Tomcat原理详解及请求过程
    mysql数据库乱码的问题解决
    AOP的实现原理
    Springl利用Aspectj的扩展实现Aop
    JDK动态代理实现原理
  • 原文地址:https://www.cnblogs.com/selinamee/p/9289716.html
Copyright © 2011-2022 走看看