6.事务

# 6.事务

6.1什么是事务

概念:事务就是将一组SQL放在一个批次去进行

image-20211020103952113

要么都成功,要么都失败

A给B转钱了,但是钱没转到帐,A钱少了,B没收到,那么就是失败了

事务原则 ACID原则

原子性(Atomic)

  • 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(ROLLBACK)到事务开始前的状态,就像这个事务从来没有执行过一样。

例子:就上面转钱,A给B转钱可以分为两个步骤

A: 1000 - 200 = 800

B: 200 + 200 = 400

原子性表示这两个步骤一起成功,或者一起失败,不能只发生其中一个

一致性(Consist)

  • 一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant)

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

例子:A和B的总额一直都是1200,不可能变多或者变少

隔离性(Isolated)

  • 隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

例子:A和C同时给B转账,但是并不会相互影响

如果隔离失败,就会出现一些问题

脏读:读到了别的事务回滚前的脏数据

...

持久性(Durable)

  • 在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

如果在操作事务的时候断电了或者服务器宕机

事务没有提交,恢复到原状

事务已经提交,持久化到数据库

事务一旦提交就不可逆

来一个例子:

-- 转账
CREATE DATABASE shop CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
USE shop

CREATE TABLE `account`(
  `id`  INT(4) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20) NOT NULL,
  `balance` DECIMAL(9,2) NOT NULL, -- 一个九位数,其中小数位是两位
  PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4


INSERT INTO `account`(`name`,`balance`) VALUES ('A',1000.00),('B', 2000.00)

-- 模拟转账:事务

SET autocommit = 0 -- 关闭自动提交
START TRANSACTION -- 开启一个(组)事务

UPDATE account SET balance = balance - 500 
WHERE `name` = 'A'

UPDATE account SET balance = balance + 500 
WHERE `name` = 'B'

COMMIT -- 提交事务,一旦提交就持久化了
ROLLBACK -- 回滚,提交事务之后就无法回滚

SET autocommit = 1 -- 开启自动提交

image-20211020123445956

posted @ 2021-10-20 12:36  NoMad15234  阅读(40)  评论(0)    收藏  举报