MySQL事务

一、什么是事务

要么都成功,要么都失败
例子:转账

  • 1、sql执行 A给B转账 A 1000 —> 200 B 200
  • 2、sql执行 B收到A的钱 A 800 —>B 400

将一组sql放在一个批次中去执行,作为一个整体,要么都成功,要么都失败!

二、ACID

事务原则: ACID原则,原子性、一致性、隔离性、持久性 (脏读、幻读……)

  • 原子性是指事务的原子性操作,对数据的修改要么全部执行成功,要么全部失败,实现事务的原子性,是基于日志的Redo/Undo机制。
  • 一致性是指执行事务前后的状态要一致,可以理解为数据一致性。隔离性侧重指事务之间相互隔离,不受影响,这个与事务设置的隔离级别有密切的关系。
  • 持久性则是指在一个事务提交后,这个事务的状态会被持久化到数据库中,也就是事务提交,对数据的新增、更新将会持久化到书库中。
  • 在我的理解中,原子性、隔离性、持久性都是为了保障一致性而存在的,一致性也是最终的目的。

脏读:
指一个事务读取到了另外一个事务未提交的数据
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同(这不一定是错误的,要看场合)
幻读
指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致

三、执行事务

-- ================ mysql默认开启事务 =======================

set autocommit = 0 ; -- 关闭事务
set autocommit = 1 ; -- 开启事务



--  手动处理事务流程
set autocommit = 0;
start transaction  --标记一个事务的开始,从这个之后的sql都在同一个事务内

-- insert …  执行的sql
-- select ……
-- update ……
-- delete ……

commit;  -- 提交:持久化 (成功)

rollback; -- 回滚 : 回到原来的样子(失败)

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



-- 了解
SAVEPOINT 保存点 -- 设置一个保持点
ROLLBACK to SAVEPOINT 保存点 -- 回滚到保存点
-- 相当于小时候玩游戏的存档
RELEASE SAVEPOINT 保存点 -- 删除一个保存点

转账模拟

-- 转账
create database shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop

create table account(
	id int(5) NOT NULL auto_increment,
	`name` varchar(20) NOT NULL,
	money  DECIMAL(9,2) NOT NULL,
	primary key(id)
 )ENGINE=INNODB DEFAULT CHARSET=utf8


insert into account VALUES(1,'A',2000.0),(2,'B',20000.0)


-- 模拟转账

set autocommit = 0; -- 关闭事务自动提交
START TRANSACTION; -- 开启事务
UPDATE account set money = money - 500 where `name` = 'A';
UPDATE account set money = money + 500 where `name` = 'B';
commit; -- 提交事务
ROLLBACK; -- 回滚
set autocommit = 1; -- 开启事务自动提交

SELECT * 
from account;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值