事务与锁

什么是数据库的事务?

数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;事务是一组不可再分割的操作集合(工作逻辑单元)。

思考哪些存储引擎支持事务?

innodb

MySQL中如何开启事务?

begin/start transaction             --手工方式
set session autocommit = on/off    --设定事务是否自动开启
commit/rollback                  --事务提交或回滚

事务的四大特性

  • 原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

  • 一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

  • 隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

  • 持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

不考虑事务的隔离性,会发生的几种问题:

1. 脏读
事务A读到了事务B未提交的数据
从图中可以看出A读到了B未提交的数据18
事务与锁

2. 不可重复读
事务A读到了事务B已提交的数据
事务A读取事务B,前后读取数据不一致事务与锁
**3. 虚读(幻读)**z
事务A读到了事务B多余的数据
事务A查询为1,中间事务B插入了一条数据,事务A还没有结束,事务A用相同的查询条件去查询,结果为2,就像幻影一样冒出来一条数据
事务与锁

总结:事务并发的三大问题其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。

事务的四种隔离级别

事务与锁

MySQL InnoDB对事务隔离级别的支持程度

事务与锁

事务隔离级别解决方案

第一种:在读取数据前,对其加锁,值其他事务对数据进行修改(LBBC)Lock Based Concurrency Control.

第二种:生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取(MVCC)Multi Version Concurrency Control.

锁的基本类型

锁的粒度

:用于管理不同事务对共享资源的并发访问

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


思考:MyISAM和InnoDB分别支持什么粒度的锁?

  • MyISAM默认的用的是表级锁,不支持行级锁。lock tables xxx read/write
  • InnoDB默认的是行级锁,也支持表级锁。

InnoDB锁类型

事务与锁

共享锁

事务与锁

排他锁

事务与锁

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

事务与锁

记录、间隙、临建锁

事务与锁