事务

什么是事务

要么都成功,要么都失败


1、SQL执行 A给B转账 A 1000 ---> 200 B 200

2、SQL执行 B收到A的钱 A 800 --> B 400


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

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

参考博客链接https://blog.csdn.net/dengjili/article/details/82468576/

原子性(Atomicity)

要么都成功,要么都失败

一致性(Consistency) ---事务提交

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

持久性(Durability)

事务一旦提交则不可逆,被持久化到数据库中!

隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

隔离所导致的一些问题

脏读:

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

不可重复读:

在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)

虚读(幻读)

是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。

 

执行事务

 

  -- =================  事务  =================
  -- 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
 USE shop
 
 CREATE TABLE `account`(
 `id` INT(4) 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; -- 恢复默认值

 

 

posted @ 2022-08-21 23:36  少时凌云志  阅读(49)  评论(0)    收藏  举报