您的位置:首页 > 数据库 > MySQL

深入理解Mysql——锁与事务隔离级别

2020-05-29 16:10 169 查看

这里写目录标题

  • 事务隔离级别
  • MVCC机制
  • 锁分类

    从性能上分类:乐观锁和悲观锁
    从数据库操作类型分类:读锁和写锁
    从数据操作粒度分类:表锁和行锁

    表锁

    每次加锁锁住整张表,开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲 突的概率最高,并发度最低;
    对于不同的数据库引擎,有不同的设定
    MyISAM中只有表锁,没有行锁。
    MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,
    在执行增删改 操作前,会自动给涉及的表加写锁。
    对MyISAM表的读操作(加读锁) ,不会阻寒其他进程对同一表的读请求,但会阻赛对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
    对MylSAM表的写操作(加写锁) ,会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。

    行锁

    每次操作锁住一个数据行。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁 冲突的概率最低,并发度最高。
    InnoDB支持:事务&& 行锁
    事务的ACID:Atomicity(原子性),Consistent(一致性),Isolation(隔离性),Durable(持久性)
    并发事务的问题:更新丢失(Lost Update),脏读(Dirty Reads),不可重读(Non-Repeatable Reads),幻读(Phantom Reads)。

    间隙锁

    间隙锁可以解决幻读问题。
    如果新建的数据行是在锁划分的间隙范围内,则其他Session没法在这个范围所包含的间隙里插入或修改任何数据。

    事务隔离级别

    项目 脏读 可重复读 幻读
    Read-Uncommitted 可能 可能 可能
    Read-Committed 不可能 可能 可能
    Repeatable-Read 不可能 不可能 可能
    Serializable 不可能 不可能 不可能

    常看当前数据库的事务隔离级别: show variables like ‘tx_isolation’;
    设置事务隔离级别:set tx_isolation=‘REPEATABLE-READ’;

    MVCC机制

    每一次的修改数据,都会生成新的快照。
    我们要找的就是在事务正式开始前的最近一次更新的快照。
    当事务开始,就会有MySQL分配的事务id,先执行的id小,后执行的id值会增加。
    如果当前id值为12 ,那么在执行查询操作时,会带上id=12 ,并且实现MVCC机制:
    创建事务id <= 12(当前事务id,快照点已提交最大事务id),删除事务id> 12(当前事务id,快照点已提交最大事务id),满足这一条件的快照会被返回。

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: