6.事务
# 6.事务
6.1什么是事务
概念:事务就是将一组SQL放在一个批次去进行

要么都成功,要么都失败
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 -- 开启自动提交


浙公网安备 33010602011771号