概念

  • TCL( Transaction Control Language ) 事务控制语言,主要用于数据库的事务管理

    • START TRANSACTION: 开启事务
    • COMMIT: 提交事务
    • ROLLBACK: 回滚事务
    • SET TRANSACTION: 设置事务的属性
  • MySQL 事务处理只支持 InnoDB 和 BDB 数据表类型

特性

操作序列要成为事务,必须满足事务的 ACID 特性: ACID: 数据库事务特性,分别是 Atomic原子性,Consistency 一致性,Isolation 隔离性,Durability 持久性
CAP: 分布式系统基本需求,分别是 Consistency 一致性,Availability 可用性,Partition tolerance 分区容错性

原子性

事务中的所有操作可以看做一个原子,事务中的操作都具有共同的目标且相互依赖,原子性消除系统只处理部分操作的可能性。即语句必须同时执行成功,如果一处执行失败就是全部失败

一致性

事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态。一致性是通过原子性保证的。如:AB转账时,只有保证 A转出 和 B转入的金额一致才能构成事务,也就是事务发生前和事务发生后,数据的总额依然匹配

隔离性

各个事务的执行互不干扰,即并发执行的事务之间既不能看到对方的中间状态,也不能相互影响。如: AB转账时,只有 A转出 和 B转入操作执行成功后才能看到 A账户金额减少以及 B账户的金额增多。并且其他的事务对于转账操作的事务是不可能产生任何影响的

持久性

指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中(物理数据库)。这样即使数据库出现故障,提交的数据也应该能够恢复,除非物理数据库如硬盘损坏

事务步骤

  • MySQL 中默认语句是自动提交模式,使用事务时应先关闭自动提交,事务结束后续再恢复自动提交

    1. SET AUTOCOMMIT = 0 ; # 关闭自动提交模式
    2. SET AUTOCOMMIT = 1 ; # 开启自动提交模式
  • 操作步骤

middle_img_v2_2974082e-8a48-4a6c-aa21-f815ec8f71cg.jpg

案例演示

使用事务保证转账安全

  1. # 创建账户表
  2. CREATE TABLE account(
  3. id INT PRIMARY KEY AUTO_INCREMENT ,
  4. uname VARCHAR(10) NOT NULL ,
  5. balance DOUBLE
  6. ) ;
  7. # 插入数据
  8. INSERT INTO account VALUES (NULL, 'kuma', 2000), (NULL, 'geon', 2000) ;
  9. # 关闭自动提交
  10. SET AUTOCOMMIT = 0 ;
  11. # 手动开启事务
  12. START TRANSACTION ;
  13. UPDATE account SET balance = balance - 200 WHERE id = 1 ;
  14. UPDATE account SET balance = balance + 200 WHERE id = 2 ;
  15. # 手动回滚:刚才执行的操作全部取消
  16. ROLLBACK ;
  17. # 手动提交
  18. COMMIT ;
  19. # 开启自动提交
  20. SET AUTOCOMMIT = 1 ;

在回滚和提交之前,数据库中的数据都是操作缓存中的数据,而不是数据库的真实数据