MySQL基础-事务

108 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

事务

什么是事务

要么都成功,要么都失败

1.sql执行 A给B转账 A 1000 ->200 B200

2.sql执行 B收到的前 A800 ->B400


  • 原子性(Atomicity):表示上方所说1和2这2个步骤要么一起成功,或者一起失败,不能只发生其中一个动作
  • 一致性(Consistency):针对一个事务操作与操作后的状态一致,最终一致性 ,无论怎么转账最后的的值一定是初始总值
  • 持久性(Durability):事务没有提交,就恢复到原状,事物已经提交,持久化到数据库,事务一旦提交就不可逆
  • 隔离性(lsolation):多个用户同时操作时,互不影响,比如A给b转,C也给b转,是独立开来的 如果隔离失败
  1. 脏读:一个事务读取了另一个为提交的数据,比如C有200,A转B200,C转B100,先读取了C转B的100

2.不可重复读,在一个事务已经提交完数据后,又有人转钱(不一定错误,看场合)

3.虚读(幻读):读取到了别人的事,导致多了一行数据

执行事务

  • mysql 是默认开启事务自动提交的
  • 关闭事务set autocomit=0
  • 开启事务(默认的)set autocomit=1
  • 事务开启 start transaction 标记一个事务的开始,从这个之后的sql都在同一个事物内
  • commit提交:持久化(成功!)
  • rollback 回滚:回到的原来的样子(失败!)
  • savepoint 保存点名-设置一个事务的保存点
  • rollback to savepoint保存点名-回滚到保存点(像是游戏里死亡后存档)
  • release savepoint撤销保存点

QQ截图20220424180303.png

模拟场景

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

QQ截图20220424181548.png

-- 模拟转张:事务

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

QQ截图20220424181929.png