第 9 章 · 第一节 · 课件第 1、2 页
第 9 章 数据库并发控制与封锁
本章讲多个用户同时操作数据库时,怎样保证数据的一致性。

知道更多本章内容
本章六部分:并发性的含义、事务及其性质、并发控制与数据的不一致性、事务的隔离级别、封锁及封锁协议、小结。
本章讲多个用户同时操作数据库时,怎样保证数据的一致性。

本章六部分:并发性的含义、事务及其性质、并发控制与数据的不一致性、事务的隔离级别、封锁及封锁协议、小结。
多个用户同时操作数据库,能提高效率,但可能造成数据不一致。

| 方式 | 特点 |
|---|---|
| 串行 | 一个一个执行,机器常空闲 |
| 并行 | 效率高,可能出现不一致 |
事务中的操作要么全部完成,要么全部不做。
| 模式 | 说明 |
|---|---|
| 自动提交 | 每条语句自动作为一个事务,是 MySQL 的默认模式 |
| 显式 | 用 START TRANSACTION 开始,COMMIT 或 ROLLBACK 结束 |
| 隐式 | 关闭自动提交后,语句自动开始事务,写 COMMIT 才提交 |
| 分布式 | 一个事务涉及多台服务器,本课程不涉及 |
| 语句 | 作用 |
|---|---|
START TRANSACTION | 开始一个事务 |
COMMIT | 提交事务中的全部修改,结束事务 |
ROLLBACK | 撤销事务中的全部修改,结束事务 |
SELECT @@autocommit; 查看自动提交,1 表示打开SET autocommit = 0; 关闭自动提交自动提交模式下,UPDATE 执行成功就已经提交。要能回滚,先用 START TRANSACTION 开始事务。
转账的六个操作放在一个事务中完成。
USE bankaccount; START TRANSACTION; SELECT * FROM account; SELECT R FROM account WHERE id = 'account1'; UPDATE account SET R = R - 100 WHERE id = 'account1'; UPDATE account SET datetime = NOW() WHERE id = 'account1'; SELECT R FROM account WHERE id = 'account2'; UPDATE account SET R = R + 100 WHERE id = 'account2'; UPDATE account SET datetime = NOW() WHERE id = 'account2'; COMMIT;
| id | R |
|---|---|
| account1 | 500.00 |
| account2 | 900.00 |
| account3 | 900.00 |
字符串要用英文单引号括起来,用中文引号会报错 1054。
原子性、一致性、隔离性、持久性。
| 性质 | 含义 | 在转账事务中 |
|---|---|---|
| 原子性 Atomicity | 事务中的操作要么全部执行,要么全部不执行 | 转出后发生故障,已转出的 100 元要撤销 |
| 一致性 Consistency | 事务使数据库从一个一致状态转到另一个一致状态 | 转账前后,两个账户的总额都是 1400 元 |
| 隔离性 Isolation | 并发执行的事务之间互不干扰 | 提交前,其他事务看不到转账的中间状态 |
| 持久性 Durability | 事务提交后,对数据的修改是永久的 | 转账提交后,即使系统发生故障,结果也不会丢失 |
| 账户 | 故障发生时 | 系统恢复后 |
|---|