目录

事务

事务

什么是事务?

要么都成功,要么都失败


1、sql执行 A给B转账 A100 –>200 B 200

2、sql执行 B收到A的钱 A 800 –>400


将一组SQL放在同一个批次中执行,要么都成功,要么都失败

事务原则:ACID原则: 一致性,隔离性,持久性,原子性

原子性

针对同一个事务要么都完成,要么都不完成

一致性

事务前后的数据完整性要保证一致

最终一致性

​ a转入200,b收到200,无论怎么转,最终的总值肯定是100

持久性

事务一旦提交,则不可逆,被持久化到数据库中

操作前 A:800 B:200

操作后:A:600 B:400

假设在操作前(事务还没有提交),服务器宕机或者断电,那么重启数据库之后数据状态不变

如果在操作后(事务已经提交),服务器宕机或者断电,那么重启数据库之后数据的状态应该为A:600,B:400

隔离性

在多个用户并发访问数据库时,市局哭不能被其他事务操作的数据所干扰,植物之间要相互隔离

针对多个用户同时操作,主要是排除其他事物对本次事务的影响

隔离所导致的一些问题,同一个应用程序中的多个事务或不同应用程序中的多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题,这些问题可分为如下三种类型:

脏读、不可重复读、幻读

脏读

指一个事务读取了另外的一个事务未提交的数据

不可重复读

![image-20201223103940949](/Users/cjp/Library/Application Support/typora-user-images/image-20201223103940949.png)

不一定是错误

幻读(虚读)

指在事务内读取了别的事务插入的数据,导致前后读取不一致

(一般是行影响,多了一行)

![image-20201223104045833](/Users/cjp/Library/Application Support/typora-user-images/image-20201223104045833.png)

解决方案

根据实际需求,通过设置数据库的事务隔离级别可以解决多个事务并发情况下出现的脏读、不可重复读和幻读问题,数据库事务隔离级别由低到高依次为Read uncommitted、Read committed、Repeatable read和Serializable等四种。

隔离级别

事务的隔离级别主要用来控制多事务并发时的数据可见性

Mysql支持上面的四种隔离级别

  • READ-UNCOMMITTED(未提交读) 一个事务可以读取到另一个事务未提交的数据,如果事务回滚时,会发生脏读(对错误数据进行了处理)
  • READ-COMMITTED(提交读) 不会读到另一个事务未提交事务的数据,但是如果事务提交以后,再次查询,两次查询的数据不一致(在一个事务中,两次查询的数据不一致),也叫不可重复读。
  • REPEATABLE-READ(可重复读) 同一个事务中,不论另一个事务是否删除、更新、插入,本次查询的数据一致(快照读,相当于给数据拍了一张照片),也叫可重复读,可重复读的实现就是通过mvcc和锁来实现的。
  • SERIALIZABLE(序列化) 是最高的事务隔离级别,在该级别下,事务串行化顺序执行(锁表,只有当一个事务处理完成以后,另一个事务才能处理数据),可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

MVCC是一种多版本并发控制机制,使得大部分支持行锁的事务引擎不再单纯的使用行锁来进行数据库的并发控制,

MVCC主要是针对于REPEATABLE-READ事务隔离级别做的在此隔离级别下,AB事务所示的数据相互隔离,互相更新不可见