事务实测
事务概念
事务(Transaction)是一组作为单个逻辑工作单元执行的 SQL 操作集合,这些操作要么全部成功执行,要么全部不执行。
事务的典型应用场景:
- 银行转账操作(需要同时更新两个账户的余额)
- 订单处理系统(需要同时创建订单和扣减库存)
- 数据批处理任务(需要确保批量操作全部成功)
事务控制命令
BEGIN或START TRANSACTION:开始一个新事务COMMIT:提交事务,永久保存所有更改ROLLBACK:回滚事务,撤销所有未提交的更改SAVEPOINT:在事务中创建保存点,允许部分回滚
数据库事务的四大特性
原子性(Atomicity)
原子性保证事务中的所有操作要么全部成功执行,要么全部不执行。这就像银行转账操作:如果A账户扣款成功而B账户入账失败,系统会自动将A账户的扣款撤销。
一致性(Consistency)
一致性确保事务执行前后数据库都处于一致状态。数据库通过预定义的各种约束条件(如主键约束、外键约束、唯一约束等)来保证一致性。
隔离性(Isolation)
隔离性定义了多个并发事务之间的可见性和影响程度。常见的隔离级别包括:
- 读未提交(Read Uncommitted)
- 读已提交(Read Committed)
- 可重复读(Repeatable Read)
- 串行化(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;
事务测试
测试模拟两个数据库会话窗口在事务隔离环境下的操作情况。
测试步骤:
- A窗口开启事务:
START TRANSACTION; - B窗口执行查询:此时B窗口看不到A窗口未提交的修改
- A窗口执行更新:
UPDATE user_info SET money = money + 1 WHERE name = 'wzk'; - A窗口COMMIT后,B窗口才能看到更新后的数据
通过这个测试可以验证:处于事务中的增删改不会立即对其他会话生效,只有在COMMIT之后才会生效。