目录
事务处理语言TCL
事务简介
事务的特性:ACID
ACID属性是数据库事务处理的核心,它们共同确保了在并发和故障情况下,数据库能够保持数据的一致性和完整性。
- A(Atomicity):原子性
- 事务被视为最小单位,操作要么全部完成,要么全部不执行
- 在执行过程中,如果发生故障,事务将被回滚到开始事务之前的状态。
- C(Consistency):一致性
- 事务必须确保数据库从一个一致的状态转换到另一个一致的状态
- 一致性状态指的是数据库中的数据应该满足所有的完整性约束
- I(Isolation):隔离性
- 数据库系统提供一定的隔离级别,防止多个事务并发执行时相互干扰
- 隔离性确保事务在并发环境中独立执行,不会相互冲突或产生不一致的结果
- D(Durability):持久性
- 一旦事务被提交,它对数据库的更改应该是永久的
- 即使发生系统故障,提交事务发生的更改不会丢失
事务控制
事务的控制是通过一系列控制语句来完成的,代表事务的各个阶段。
语句 | 说明 |
---|---|
BEGIN | 开始一个新的事物 |
SAVEPOINT | 设置事物的保存点 |
COMMIT | 提交事务 |
ROLLBACK | 回滚当前事务到初始状态,撤销提交前的操作 |
ROLLBACK TO SAVEPOINT name | 回滚事务到指定保存点name,并撤销保存点后的操作 |
SET AUTOCOMMIT | 设置当前连接是否自动提交事务,1表示启用自动提交,0表示禁止自动提交 |
RELEASE SAVEPOINT | 释放保存点 |
SET TRANSACTION | 设置事务的隔离级别 |
查看当前事务是否设置了自动提交:
select @@autocommit;
并发事务的隔离挑战
事务并发是指多个事务同时对一个数据进行操作。
并发事务未进行隔离设置,会出现以下问题:
- 脏读:一个事务读取到另一事务未提交的更新数据(读取到了未持久化的数据)
- 说明:当一个事务正在访问数据,并且对事务进行了修改,而这个数据未提交到数据库中,另一个事务也在访问这个数据,读到了修改后的数据。
- 例子:T1开启了一个长事务,在较早的时候删除了一条数据,此时T2查询数据库中的数据,就会少统计一条,此时T1进行回滚,T2再查询后发现前后数据不一致。
- 不可重复度:同一事务中,多次读取同一事物返回的结果不同(在同一事务中多次读取同一数据得到了不同结果)
- 说明:后续读取到的是另一事物已提交的更新数据。
- 例子:T1开启了一个长事务,在较早的时候读取了一个数据,此时T2更改了数据并提交,随后T1再次读取但获得了新版本的数据。
- 幻读:同一事务中,以同样的条件进行范围查询,两次获得的数据数量不一致
- 例子:T1先执行了一次查询,然后事务T2新插入一条数据,T1使用相同的查询对表进行检索时,会发现这条多出来的数据。
- 与不可重复读的区别:幻读专指新插入的行。
事务的隔离级别
读未提交、读已提交、可重复读、可串行化
名称 | 含义 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
读未提交 | 一个事务提交前,它的变更就已经能被其他事务看到 | √ | √ | √ |
读已提交 | 一个事务提交后,它的变更才能被其他事务看到 | √ | √ | |
可重复读 | 未提交的事务的变更不能被其他事务看到,同时一次事务过程中多次读取同样记录的结果是一致的 | √ | ||
可串行化 | 当两个事务间存在读写冲突时,数据库通过加锁强制事务串行执行 |
- 读未提交 READ-UNCOMMITED:隔离级别最弱,并发性最好。
- 读已提交 READ COMMITED:是大部分数据库系统的默认级别,但MySQL不是。
- 可重复读 REPEATABLE READ:MySQL中事务的默认隔离级别。可以理解为事务开始时对数据库拍了一个快照,后续操作都在快照的基础上进行,不会读取到别的事务的提交结果。
- 可串行化 SERIALIZABLE:最高的隔离级别。两个事务存在读写冲突时,数据库通过加锁,强制事务串行执行。
MySQL约束控制
在表和字段上强制执行的数据检测规则,防止不规则的数据进入数据库
非空约束 NOT NULL
保证该字段不为空
NULL和" "的区别:
- NULL:NULL表示缺失的或未知的数据。它不是任何类型的实例,也不占用内存空间
- " ":表示一个已分配的对象,但其内容是空的。在字符串的上下文中,""是一个有效的字符串,只不过它的长度为零。
主键约束 PRIMARY KEY
保证该字段的值具有唯一性,且每张表只能有一个主键,默认非空
自增序列 auto_increment:当插入数据时,自增序列为null时,数据会自动+1。一张表有且只能有一个自增序列,一般搭配主键使用。
默认值约束 DEFAULT
保证该字段总会有值。
在插入数据时,即使不给字段指定值,会自动插入默认值。
唯一约束 UNIQUE
保证字段唯一性,每张表中可以有多个唯一约束
外键约束 FOREIGN KEY
限制两个表的关系,保证表中该字段的值来自关联表