美文网首页
Mysql锁与事务

Mysql锁与事务

作者: hcq0514 | 来源:发表于2020-03-23 16:56 被阅读0次

    1 锁的分类

    • 从性能上分为乐观锁(用版本对比来实现)和悲观锁
    • 从对数据库操作的类型分,分为读锁和写锁(都属于悲观锁)
      读锁(共享 锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
      写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁
    • 从对数据操作的粒度分,分为表锁和行锁
    1. 表锁(偏读)
      表锁偏向MyISAM存储引擎,开销小,加锁快,无思索,锁定粒度大,发生锁冲突的概率最高,并发度最低。
      MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
      1、对MyISAM表的读操作(加读锁) ,不会阻寒其他进程对同一表的读请求,但会阻赛对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
      2、对MylSAM表的写操作(加写锁) ,会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作
      总结:
      简而言之,就是读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。
    1. 行锁(偏写)
      行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
      InnoDB与MYISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。
      3.1 事务特性ACID

    2. 并发事务会带来的问题

    • 脏读:事务A修改的数据还未提交,就被事务B读取到了,这时候事务A回滚了,事务B读取到的就是脏数据
    • 不可重复读:事务A第一次读到count的值为1,此时事务B已经更新了count的值为2,此时事务A再次读取count时,读取到的值是2(同一个事务里不可以重复读到相同的数据简称不可重复读,事务B里面修改了数据)
    • 幻读:事务A读取到了事务B提交的新增数据,不符合隔离性(幻读是事务B里面新增了数据)
    1. 事务的隔离级别
      脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。
    • 读未提交:一个事务还未提交,它所做的变更就可以被别的事务看到
    • 读已提交:一个事务提交之后,它所做的变更才可以被别的事务看到
    • 可重复读:一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的
    • 串行化:对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行



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

    相关文章

      网友评论

          本文标题:Mysql锁与事务

          本文链接:https://www.haomeiwen.com/subject/krvwyhtx.html