MySQL事务与锁

MySQL两大数据库引擎:

  MyISAM 支持 表锁

  InnoDB 支持 行锁,表锁

数据库事务:

事务并发产生的三大问题:

一个事务执行前后两次读取另一个事务修改未提交或回滚的数据,产生脏读;

一个事物执行前后两次读取另一个事务修改或删除已提交的数据,产生不可重复读;

一个事物执行前后两次读取另一个事务增加已提交的数据,造成两次读取数据不一致,产生幻读;

事务并发产生的另一个问题: lost update丢失更新  并不是数据库层面可以解决的,在代码层解决;

事务四种隔离级别:

  事务隔离级别          脏读    不可重复读    幻读

  未提交读(Read Uncommitted)   可能    可能       可能

  已提交度(Read Committed)    不可能   可能       可能

  可重复读(Repeatable Read)      不可能     不可能      对InnoDB不可能

  串行化(Serializable)         不可能     不可能      不可能

锁的粒度:

  表锁与行锁的区别:

    锁定粒度:

  行锁:共享锁(Share Locks)

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

     加锁、释所方式:

        select * from student where id=1 LOCK IN SHARE MODE;

        commit/rollback;

        行锁:排它锁(Exclusive Locks)

     排它锁:又称写锁,简称X锁,排它锁不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能获取改数据行的锁(共享锁、排它锁),只有该获 取了排它锁的事务是可以对数据进行读取和修改的。

     加锁、释锁的方法:

        自动:delete / update / insert  默认加上X锁;

        手动: select * from student where id=1 FOR UPDATE;

        commit / rollback; //一个事务结束会释放锁

  表锁:意向共享锁(IS)/ 意向排它锁(IX)

     意向锁是有由数据引擎自己维护的,用户无法手动操作意向锁;

     意向共享锁(Intention Shared Lock,简称IS锁)

        表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁;

     意向排它锁(Intention Exclusive Lock ,简称IX锁)

        表示事务准备给数据行加入排它锁,说明事务在以嘎数据行加排它锁前必须先取得该表的IX锁;

  思考:为什么需要(标记别的)意向锁?

          表锁相当于一个标志,我们对于一张表加上表锁的前提是:没有其他事物已经锁定了这一张表的任意一行。这个标志可以提高行锁加锁效率。

     所的作用:解决资源竞争问题,解决并发问题

     锁到底锁住了什么?

      是一行数据(Row/Record)吗?

      是一个字段(Column)吗?

      答案:锁住了索引。

  Record Lock : 记录锁

    唯一性索引(唯一/主键)等值查询,精准匹配。

    select * from student whrer id=2 for update;

    锁住 id=4

  Gap Lock : 间隙锁

    条件:记录不存在

    注意:Gap锁之间不冲突,Gap Lock 只在RR(可重复读)事务个理解别存在。

    select * from student where id>4 and id <7 for update;

         select * from student where id=6 for update;

    锁住:(4,7)

  Next-Key Lock : 临键锁

    条件:既包含记录,又包含区间

    Next-Key Lock = Gap Lock + Record Lock

    select * from student where id>5 and id<9 for update;

  

    锁住:(4,7]  (7,10]

    InnoDB引擎默认可重复读事务隔离级别,因为RR事务加入了间隙锁,在查询时锁住查询范围内的间隙,使其他事务不能够插入数据,从而避免幻读。

 

索引:

 

  什么是索引?

 

  索引的底层数据结构是什么?

 

  主键索引和辅助索引?

 

  不同的索引存储数据的方式不一样。

 

posted @ 2019-07-05 10:15  尘世间迷茫的小书童  阅读(142)  评论(0)    收藏  举报