事务实测

事务概念

事务(Transaction)是一组作为单个逻辑工作单元执行的 SQL 操作集合,这些操作要么全部成功执行,要么全部不执行。

事务的典型应用场景

  1. 银行转账操作(需要同时更新两个账户的余额)
  2. 订单处理系统(需要同时创建订单和扣减库存)
  3. 数据批处理任务(需要确保批量操作全部成功)

事务控制命令

  • BEGINSTART TRANSACTION:开始一个新事务
  • COMMIT:提交事务,永久保存所有更改
  • ROLLBACK:回滚事务,撤销所有未提交的更改
  • SAVEPOINT:在事务中创建保存点,允许部分回滚

数据库事务的四大特性

原子性(Atomicity)

原子性保证事务中的所有操作要么全部成功执行,要么全部不执行。这就像银行转账操作:如果A账户扣款成功而B账户入账失败,系统会自动将A账户的扣款撤销。

一致性(Consistency)

一致性确保事务执行前后数据库都处于一致状态。数据库通过预定义的各种约束条件(如主键约束、外键约束、唯一约束等)来保证一致性。

隔离性(Isolation)

隔离性定义了多个并发事务之间的可见性和影响程度。常见的隔离级别包括:

  1. 读未提交(Read Uncommitted)
  2. 读已提交(Read Committed)
  3. 可重复读(Repeatable Read)
  4. 串行化(Serializable)

持久性(Durability)

持久性保证一旦事务提交,其结果将永久保存在数据库中,即使系统发生故障也不会丢失。

最小测试

建立新表

CREATE TABLE `user_info` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `money` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

事务测试

测试模拟两个数据库会话窗口在事务隔离环境下的操作情况。

测试步骤

  1. A窗口开启事务:START TRANSACTION;
  2. B窗口执行查询:此时B窗口看不到A窗口未提交的修改
  3. A窗口执行更新:UPDATE user_info SET money = money + 1 WHERE name = 'wzk';
  4. A窗口COMMIT后,B窗口才能看到更新后的数据

通过这个测试可以验证:处于事务中的增删改不会立即对其他会话生效,只有在COMMIT之后才会生效。