要么都成功,要么都失败


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

事务的ACID原则 百度 ACID (脏读,幻读)

https://blog.csdn.net/dengjili/article/details/82468576

原子性(Atomicity)

要么都成功要么都失败

一致性(Consistency)

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

持久性(Durability) —事务提交

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

隔离性(Isolation)

在两个都在操作的时候,数据库为每一个用户开启单独的事务,不会被其他事务所干扰。

隔离所导致的一些问题:

脏读:

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

不可重复读:

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

虚读(幻读):

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

  1. -- ============================事务==========================
  2. -- 使用set语句来改变自动提交模式
  3. SET autocommit = 0; /*关闭*/
  4. SET autocommit = 1; /*开启(默认的)*/
  5. -- 注意:
  6. -- 1.MySQL中默认是自动提交
  7. -- 2.使用事务时应先关闭自动提交
  8. -- 开始一个事务,标记事务的起始点
  9. START TRANSACTION -- 提交一个事务给数据库
  10. COMMIT -- 将事务回滚,数据回到本次事务的初始状态
  11. ROLLBACK -- 还原MySQL数据库的自动提交
  12. SET autocommit =1; -- 保存点
  13. SAVEPOINT 保存点名称 -- 设置一个事务保存点
  14. ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
  15. RELEASE SAVEPOINT 保存点名称 -- 删除保存点
  16. -- 转账
  17. CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci;
  18. USE `shop`;
  19. CREATE TABLE `account`(
  20. `id` INT(3) NOT NULL AUTO_INCREMENT,
  21. `name` VARCHAR(30) NOT NULL,
  22. `money`DECIMAL(9,2) NOT NULL,
  23. PRIMARY KEY (`id`)
  24. )ENGINE=INNODB DEFAULT CHARSET=utf8
  25. INSERT INTO account(`name`,`money`)
  26. VALUES ('A',2000.00),('B',10000.00)
  27. -- 模拟转账:事务
  28. SET autocommit = 0; -- 关闭自动提交
  29. START TRANSACTION -- 开启一个事务
  30. UPDATE account SET money=money-500 WHERE `name` = 'A' -- A500
  31. UPDATE account SET money=money+500 WHERE `name` = 'B' -- B500
  32. COMMIT; -- 提交事务
  33. ROLLBACK; -- 回滚
  34. SET autocommit = 1; -- 恢复默认值

事务的实际使用
image.png