数据库——事务及事务的ACID原则

数据库——事务

事务:事务是用户定义的一个数据库操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位,事务是并发控制的基本单位。

事务的ACID原则

  • 原子性(atomicity):事务中包括的操作要么都做,要么都不做,

  • 一致性(consistency):针对一个事务操作前与操作后的状态一致。一致性和原子性密切相关(因为一个事务不管做或者没做,数据库都处于一致状态,但如果事务中一个操作做了,但另一个操作没做,则逻辑上就会发生错误,这是数据库就不处于一致状态了)

  • 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。针对对个用户同时操作,主要是排除其他事物对本次事务的影响

    隔离所导致的问题:

    • 脏读:指一个事务读取了另外一个事务未提交的数据。
    • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同(数据内容不一致)。
    • 幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取到的数据不一致(数据总量不一致)。
  • 持久性(durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,不可逆的。接下来的其他操作或故障不应该对其有任何影响。

    • 如果在操作之前(事务还没有提交)服务器宕机或者断电,那么重启数据库之后,数据状态还是操作之前的,恢复到原状
    • 如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库之后,数据状态应为操作之后的,持久化到数据库的

模拟场景

-- =====================================事务======================================
-- mysql是默认开启自动提交事务的
SET autocommit = 0 -- 关闭事务自动提交
SET autocommit = 1 -- 开启事务自动提交

-- 手动处理事务流程
SET autocommit = 0 -- 1.关闭事务自动提交
-- 2.事务开启
START TRANSACTION -- 标志一个事务的开启,此后的SQL语句都在同一个事务内

INSERT xxx
INSERT xxx

/*
在中间可以设置事务的保存点
SAVEPOINT  保存点名

ROLLBACK  TO SAVEPOINT 回滚到保存点

RELEASE SAVEPOINT 撤销保存点
*/


-- 3.提交 执行成功了就提交,数据就被持久化到数据库
COMMIT

-- 回滚  失败了数据就恢复到原来的样子,回滚到事务开始的状态
ROLLBACK

-- 4.事务结束
SET autocommit = 1 -- 开启事务自动提交


-- ==============模拟场景-- 转账事务====================
-- 建一个数据库
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
-- 建一个表
CREATE TABLE `account`(
`id` INT(3) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY(`ID`)

)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account (`name`,`money`)
VALUES ('A',2000.00),('B',10000.00)

SET autocommit = 0; -- 关闭事务自动提交

START TRANSACTION -- 标志一个事务的开启,此后的SQL语句都在同一个事务内

UPDATE account SET money=money-500 WHERE `name`='A'  -- A减500
UPDATE account SET money=money+500 WHERE `name`='B'  -- B加500

COMMIT -- 提交事务 一但提交,数据就被持久化到数据库

ROLLBACK -- 回滚
 
SET autocommit = 1 -- 开启事务自动提交

猜你喜欢

转载自blog.csdn.net/wpc2018/article/details/108979713