【MySQL】事务
什么是事务?
==要么都成功,要么都失败==
————————
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;-- 恢复默认值

本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果