Mysql事务与锁详解

事务

事务并发的三大问题

事务的四种隔离级别

Read Uncommitted(未提交读) --未解决任何并发问题

  事务未提交的数据对其他事务也是可见的,会出现幻读

Read Committed(已提交读) --解决脏读问题

  一个事务开始之后,只能看到已提交的事务所做的修改,会出现不可重复读

Repeatable Read(可重复读) --解决不可重复读问题

  在同一个事务中多次读取同样的数据结果是一样的,这种隔离级别未定义解决幻读的问题

Serializable(串行化) --解决所有问题

  最高的隔离级别,通过强制事务的串行执行

事务隔离级别的实现

 解决方案:

第一种:在读取数据前,对其加锁,防止其他事务对数据进行修改(LBCC)Lock Based Concurrency Control。
第二种:生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定的级别(语句级或事务级)的一致性读取(MVCC)Multi Version Concurrency Control。

锁的基本类型

锁的粒度

锁:用于管理不同事务对共享资源的并发访问
表锁与行锁的区别:

锁定粒度:表锁 > 行锁
加锁效率:表锁 > 行锁
冲突概率:表锁 > 行锁
并发性能:表锁 < 行锁

Mysql InnDB锁类型

共享锁(行锁):Shared Locks

  又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改;
  加锁释锁方式:
  select * from user where id = 1 LOCK IN SHARE MODE;
  commit/rollback;  

排它锁(行锁):Exclusive Locks

  又称为写锁,简称X锁,排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的锁(共享锁、排他锁),只有该获取了排他锁的事务是可以对数据行进行读取和修改。
  加锁释锁方式:
  自动:delete/update/insert 默认加上X锁
  手动:select * from user where id = 1 FOR UPDATE;
     commit/rollback;

意向共享锁(表锁):Intention Shared Locks / 意向排它锁(表锁):Intention Exclusive Locks

  意向共享锁:表示事务准备给数据行加入共享锁,也就说一个一个数据行加共享锁前必须先取得该表的IS锁。
  意向排它锁:表示事务准备给数据行加入排它锁,说明事务在一个数据行加排它锁前必须先取得该表的IX锁。
  意向锁是由数据引擎自己维护的,用户无法手动操作意向锁。


行锁算法
记录锁 Record Locks
间隙锁 Gap Locks
临键锁 Next-key Locks

 

锁的原理:到底锁住了什么?

 

行锁的算法:锁住了什么范围?

 

posted @ 2019-07-29 10:23  dc_xgs  阅读(178)  评论(0编辑  收藏  举报