什么是事务?

==要么都成功,要么都失败==

————————

1、执行SQL语句,A给B转账 A 1000 —》200 800

2、执行SQL语句,B收到A的钱 A 800 -----》200 1000

————————

将一组SQL放在一个批次中去执行

事务原则:

原子性,一致性,隔离性,持久性

原子性

要么都成功,要么都失败;

一致性

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

隔离性

事务的隔离性是多个用户并发放稳数据库时,数据库为每一个用户开启的事务,不能被其他事务操作,事务之间要相互隔离;

持久性

事务一但提交就不可逆,将被持久化到数据库中;

并发一致性问题

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

不可重复读:在一个事务内读取同一行数据,多次的读取结果不同

幻读:在一个事务中,读取到了别的事务插入的数据,导致前后总数不一致,好像出现了幻觉一样。

事务的隔离级别

未提交读:事务还未提交,其他事务就能看到本事务的修改。

提交读:事务提交后,其他事务才能看待本事务的修改。

可重复读:在同一事务内,多次读取同一行数据的结果是一样的。

串行化:强制所有事务串行执行。

执行事务

-- mysql 是默认开始事务自动提交的
set autocommit = 0; -- 关闭
set autocommit = 1; -- 开启(默认的)

-- 手动处理事务
set autocommit = 0;  -- 关闭自动提交


-- 事务开启
start transaction; -- 标记一个事务的开始,从这个之后的 SQL 都在同一个事务中

insert xx;
insert xx;

-- 提交(持久化)(成功!)
comment;
-- 失败:回滚
-- 回滚到原来的样子
rollback;

-- 事务结束
set autocommit = 1;  -- 开启自动提交



-- 了解
SAVEPOINT 保存点名; -- 设置一个事务的保存点
ROLLBACK TO 保存点名;  -- 回滚到保存点
RELEASE SAVEPOINT 保存点名;  -- 撤销保存点

模拟场景

-- 模拟转账

create database shop Character set utf8 collate utf8_general_ci;
use shop;


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',1000.00);

-- 模拟转账:事务
set autocommit = 0;  -- 关闭自动提交
start transaction;   -- 开启一个事务

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;-- 恢复默认值

在这里插入图片描述