auto commit
This commit is contained in:
@ -68,7 +68,7 @@
|
||||
|
||||
## AUTOCOMMIT
|
||||
|
||||
MySQL 默认采用自动提交模式。也就是说,如果不显示使用`START TRANSACTION`语句来开始一个事务,那么每个查询都会被当做一个事务自动提交。
|
||||
MySQL 默认采用自动提交模式。也就是说,如果不显式使用`START TRANSACTION`语句来开始一个事务,那么每个查询都会被当做一个事务自动提交。
|
||||
|
||||
# 二、并发一致性问题
|
||||
|
||||
@ -131,8 +131,8 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
|
||||
|
||||
有以下两个规定:
|
||||
|
||||
1. 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。
|
||||
2. 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。
|
||||
- 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。
|
||||
- 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。
|
||||
|
||||
锁的兼容关系如下:
|
||||
|
||||
@ -149,8 +149,8 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
|
||||
|
||||
意向锁在原来的 X/S 锁之上引入了 IX/IS,IX/IS 都是表锁,用来表示一个事务想要在表中的某个数据行上加 X 锁或 S 锁。有以下两个规定:
|
||||
|
||||
1. 一个事务在获得某个数据行对象的 S 锁之前,必须先获得表的 IS 锁或者更强的锁;
|
||||
2. 一个事务在获得某个数据行对象的 X 锁之前,必须先获得表的 IX 锁。
|
||||
- 一个事务在获得某个数据行对象的 S 锁之前,必须先获得表的 IS 锁或者更强的锁;
|
||||
- 一个事务在获得某个数据行对象的 X 锁之前,必须先获得表的 IX 锁。
|
||||
|
||||
通过引入意向锁,事务 T 想要对表 A 加 X 锁,只需要先检测是否有其它事务对表 A 加了 X/IX/S/IS 锁,如果加了就表示有其它事务正在使用这个表或者表中某一行的锁,因此事务 T 加 X 锁失败。
|
||||
|
||||
@ -319,7 +319,7 @@ InnoDB 的 MVCC 使用到的快照存储在 Undo 日志中,该日志通过回
|
||||
|
||||
多个事务必须读取到同一个数据行的快照,并且这个快照是距离现在最近的一个有效快照。但是也有例外,如果有一个事务正在修改该数据行,那么它可以读取事务本身所做的修改,而不用和其它事务的读取结果一致。
|
||||
|
||||
把没对一个数据行做修改的事务称为 T,T 所要读取的数据行快照的创建版本号必须小于 T 的版本号,因为如果大于或者等于 T 的版本号,那么表示该数据行快照是其它事务的最新修改,因此不能去读取它。
|
||||
把没有对一个数据行做修改的事务称为 T,T 所要读取的数据行快照的创建版本号必须小于 T 的版本号,因为如果大于或者等于 T 的版本号,那么表示该数据行快照是其它事务的最新修改,因此不能去读取它。
|
||||
|
||||
除了上面的要求,T 所要读取的数据行快照的删除版本号必须大于 T 的版本号,因为如果小于等于 T 的版本号,那么表示该数据行快照是已经被删除的,不应该去读取它。
|
||||
|
||||
@ -339,7 +339,7 @@ InnoDB 的 MVCC 使用到的快照存储在 Undo 日志中,该日志通过回
|
||||
|
||||
### 1. 快照读
|
||||
|
||||
这是 MVCC 的一种方式,读取的是快照中的数据,可以减少加锁所带来的开销。
|
||||
使用 MVCC 读取的是快照中的数据,这样可以减少加锁所带来的开销。
|
||||
|
||||
```sql
|
||||
select * from table ...;
|
||||
@ -418,13 +418,14 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
|
||||
| 1 | 学生-1 | 学院-1 | 院长-1 | 课程-1 | 90 |
|
||||
| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-2 | 80 |
|
||||
| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-1 | 100 |
|
||||
| 3 | 学生-3 | 学院-2 | 院长-2 | 课程-2 | 95 |
|
||||
|
||||
不符合范式的关系,会产生很多异常,主要有以下四种异常:
|
||||
|
||||
1. 冗余数据:例如 学生-2 出现了两次。
|
||||
2. 修改异常:修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。
|
||||
3. 删除异常:删除一个信息,那么也会丢失其它信息。例如如果删除了 课程-1,需要删除第一行和第三行,那么 学生-1 的信息就会丢失。
|
||||
4. 插入异常,例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。
|
||||
- 冗余数据:例如 学生-2 出现了两次。
|
||||
- 修改异常:修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。
|
||||
- 删除异常:删除一个信息,那么也会丢失其它信息。例如如果删除了 课程-1,需要删除第一行和第三行,那么 学生-1 的信息就会丢失。
|
||||
- 插入异常,例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。
|
||||
|
||||
## 范式
|
||||
|
||||
@ -449,6 +450,7 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;
|
||||
| 1 | 学生-1 | 学院-1 | 院长-1 | 课程-1 | 90 |
|
||||
| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-2 | 80 |
|
||||
| 2 | 学生-2 | 学院-2 | 院长-2 | 课程-1 | 100 |
|
||||
| 3 | 学生-3 | 学院-2 | 院长-2 | 课程-2 | 95 |
|
||||
|
||||
以上学生课程关系中,{Sno, Cname} 为键码,有如下函数依赖:
|
||||
|
||||
@ -468,6 +470,7 @@ Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门
|
||||
| :---: | :---: | :---: | :---: |
|
||||
| 1 | 学生-1 | 学院-1 | 院长-1 |
|
||||
| 2 | 学生-2 | 学院-2 | 院长-2 |
|
||||
| 3 | 学生-3 | 学院-2 | 院长-2 |
|
||||
|
||||
有以下函数依赖:
|
||||
|
||||
@ -481,6 +484,7 @@ Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门
|
||||
| 1 | 课程-1 | 90 |
|
||||
| 2 | 课程-2 | 80 |
|
||||
| 2 | 课程-1 | 100 |
|
||||
| 3 | 课程-2 | 95 |
|
||||
|
||||
有以下函数依赖:
|
||||
|
||||
@ -498,6 +502,7 @@ Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门
|
||||
| :---: | :---: | :---: |
|
||||
| 1 | 学生-1 | 学院-1 |
|
||||
| 2 | 学生-2 | 学院-2 |
|
||||
| 3 | 学生-3 | 学院-2 |
|
||||
|
||||
关系-12
|
||||
|
||||
|
Reference in New Issue
Block a user