首页 > 数据库 > MySQL > 正文

MySQL事务的示例解析

2024-07-24 12:33:17
字体:
来源:转载
供稿:网友
  这篇文章将为大家详细讲解有关MySQL事务的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
 
  事务最重要的四个特性通常被称为 ACID 特性
 
  A - Atomicity 原子性: 一个事务是一个不可分割的最小单位,事务中的所有操作要么全部成功,要么全部失败,没有中间状态。原子性主要是通过事务日志中的回滚日志(undo log)来实现的,当事务对数据库进行修改时,InnoDB 会根据操作生成相反操作的 undo log,比如说对 insert 操作,会生成 delete 记录,如果事务执行失败或者调用了 rollback,就会根据 undo log 的内容恢复到执行之前的状态。
 
  C - Consistency 一致性: 事务执行之前和执行之后数据都是合法的一致性状态,即使发生了异常,也不会因为异常引而破坏数据库的完整性约束,比如唯一性约束等。
 
  I - Isolation 隔离性: 每个事务是彼此独立的,不会受到其他事务的执行影响,事务在提交之前对其他事务不可见。隔离性通过事务的隔离级别来定义,并用锁机制来保证写操作的隔离性,用 MVCC 来保证读操作的隔离性,将在下文详细介绍。
 
  D - Durability 持久性: 事务提交之后对数据的修改是持久性的,即使数据库宕机也不会丢失,通过事务日志中的重做日志(redo log)来保证。事务修改之前,会先把变更信息预写到 redo log 中,如果数据库宕机,恢复后会读取 redo log 中的记录来恢复数据。
 
  ACID 特性
 
  事务处理是一种对必须整批执行的 MySQL 操作的管理机制,在事务过程中,除非整批操作全部正确执行,否则中间的任何一个操作出错,都会回滚 (Rollback) 到最初的安全状态以确保不会对系统数据造成错误的改动。
 
  之前的文章中我们提到过,MySQL 5.5 之后,默认的存储引擎从 MyISAM 替换成了 InnoDB,这其中的一个重要原因就是因为 InnoDB 支持事务,我们用 SHOW ENGINES 来看一下 MySQL 中对各种存储引擎的描述。

  事务控制语法
 
  MySQL 事务控制有几个重要节点,分别是事务的开启,提交,回滚和保存点。
 
  开启事务代表事务开始执行,语句为 START TRANSACTION 或者 BEGIN,提交事务代表将事务中的所有更新都写到磁盘的物理数据库,事务正常执行结束,语句为 COMMIT,如果发生异常需要回滚,语句为 ROLLBACK。要注意的是,一旦事务已经提交,就不能回滚了,因此,在代码执行过程中捕获到异常的时候需要直接执行 rollback 而不是 commit。
 
  比如 A 向 B 转账 100 元的事务:
 
  // 正常执行,提交
 
  BEGIN; # 开启事务
 
  UPDATE account_balance SET balance = balance - 100.00 WHERE account_name = 'A';
 
  UPDATE account_balance SET balance = balance + 100.00 WHERE account_name = 'B';
 
  COMMIT; # 提交事务
 
  // 发生异常,回滚
 
  BEGIN; # 开启事务
 
  UPDATE account_balance SET balance = balance - 100.00 WHERE account_name = 'A';
 
  UPDATE account_balance SET balance = balance + 100.00 WHERE account_name = 'B';
 
  ROLLBACK; # 事务回滚
 
  在复杂场景中,有时我们不需要全盘回滚整个操作,而是分批执行,回滚到某个节点就好了,相当于是在一个大事务下嵌套了若干个子事务,在 MySQL 中可以使用保留点 SAVEPOINT 来实现。
 
  BEGIN;
 
  insert into user_tbl (id) values (1) ;
 
  insert into user_tbl (id) values (2) ;
 
  ROLLBACK;   # 1,2 都没有写入
 
  BEGIN;
 
  insert into user_tbl (id) values (1) ;
 
  SAVEPOINT s1;
 
  insert into user_tbl (id) values (2) ;
 
  ROLLBACK TO s1;   # 回滚到保留点 s1, 因此 1 成功写入,2 被回滚, 最终结果为 1
 
  RELEASE SAVEPOINT s1; # 释放保留点
 
  顺便提一下,事务有隐式事务(自动提交)和显示事务(必须手动提交)两种,MySQL 默认为隐式事务,会进行自动提交,通过 autocommit 参数来控制。
 
  # 查看变量
 
  SHOW VARIABLES LIKE 'autocommit';
 
  +---------------+-------+
 
  | Variable_name | Value |
 
  +---------------+-------+
 
  | autocommit    | ON    |
 
  +---------------+-------+
 
  # 开启自动提交(默认)
 
  SET autocommit = 1;
 
  # 关闭自动提交
 
  SET autocommit = 0;
 
  在自动提交状态下,如果没有显示的开启事务,那每一条语句都是一个事务,系统会自动对每一条 sql 执行 commit 操作。使用 BEGIN 或 START TRANSACTION 开启一个事务之后,自动提交将保持禁用状态,直到使用 COMMIT 或 ROLLBACK 结束事务之后,自动提交模式会恢复到之前的状态。
 

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表