MySQL事务

事务

1.什么是事务

要么都成功,要么都失败

  1. SQL执行, A 给 B 转账 A 1000 ——》200 B200
  2. SQL执行, B 收到 A 的钱 A 800 ——》B400

核心:将一组SQL放在一个批次中去执行~

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

  1. 原子性(Atomicity):两个步骤一起成功一起失败(-200和+200必须同时发生)
  2. 一致性(Consistency):针对一个事务操作前和操作后的状态一致,最终一致性。(最后总共是1800,操作前后都不会发生变化)
  3. 持久性(Durability):事务结束后的数据不随着外界原因导致数据丢失。(事务没有提交,恢复原状。事务已经提交,持久化到数据库)
  4. 隔离性(Isolation):多个用户同时操作,排除其他事务对本次事务的影响

2.事务的隔离级别

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

不可重复读:在第一个事务内读取表中的某一行数据,多次读取结果不同。(不一定是错误,可能是场合不对)

幻读:指在一个事务内读取了别的事务的插入的数据,导致前后读取不一致

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

-- 手动处理事务
SET autocommit = 0   /*关闭*/


-- 事务开启
START TRANSACTION   -- 标记一个事务的开始,从这个之后的sql都在同一个事务内
INSERT xx
INSERT xx
-- 提交:持久化(成功)
COMMIT
-- 回滚:回到原来的样字(失败)
ROLLBACK
-- 事务结束
SET autocommit = 1   /*开启*/

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

模拟场景

-- 转账
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USER shop
CREATE TABLE `account`(
	`id` INT(9) 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 -- 开启一个事物
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; -- 恢复默认值
原文地址:https://www.cnblogs.com/jev-0987/p/14452350.html