文章目录
事务概念介绍
Transaction
由一系列对系统中数据进行访问和更新的操作所组成的一个程序执行逻辑单元
特性:
- 原子性
- 一致性
- 隔离性
- 持久性
事务的语法
- start transaction; 或者begin
- commit;使得当前修改确认
- rollback;使得当前修改被放弃,事务在未提交之前都是可以回滚的
注意!当前数据库的引擎为InnoDB,其他类型的数据库引擎不支持事务处理
事务的特性
事务的ACID特性
1. 原子性Atomicity
事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一
- 全部执行成功
- 全部执行失败
事务开始后的所有操作,要么全部做完,要么全部不做。不能停滞在中间环节
事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生
2.一致性Consistency
事务的一致性是指事务的执行不能破坏数据库的完整性和一致性
一个事务在执行之前和执行之后,数据库都必须处于一致性状态
3.隔离性Isolation
事务的隔离性是指在开发环境中,并发的事务是相互隔离的,也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间
也就是事务与事务不互相影响
以下解读四个隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(READ_UNCOMMITTED) | 允许 | 允许 | 允许 |
读已提交(READ_COMMITTED) | 禁止 | 允许 | 允许 |
可重复读(REPEATABLE_READ) | 禁止 | 禁止 | 可能会 |
顺序读(SERIALIZABLE) | 禁止 | 禁止 | 禁止 |
从上往下,级别越高,并发性越差,但安全性就越高,一般数据默认是读已提交和可重复读
4.持久性Duration
事务的持久性是指,事务一旦提交后,数据库中的数据必须被永久的保存下来,即使服务器崩溃、宕机等故障,只要数据库重新启动,就一定能够恢复到,事务成功结束后的状态
事务的并发问题
脏读:读取到了没有提交的数据,事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的是错误数据,也就是脏数据
不可重复读:同一条命令返回不同的结果集,事务A多次读取同一数据,事务B在事务A多次读取过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,结果不一致
幻读:重复查询的过程中,数据就发生了量的变化(insert、delete)
事务隔离级别-1读未提交
如果一个事务正在处理某一数据,并对其进行了更改,但同时未完成事务,没有提交事务
同时,允许另一个事务访问该数据
事务隔离级别-2读已提交
不同事务执行时,只能获取到已提交的数据,这样就不会出现脏读,但是在同一个事务中,执行同一个读取,结果不一致
事务隔离级别-可重复读和顺序读
可重复读:保证在事务处理过程中,多次读取同一个数据
顺序读是最严格的级别,要求所有事物顺序执行,不能并发
锁机制和隐式提交
- 读未提交:有行级锁,没有间隙锁,与读已提交的区别时能查到未提交的数据
- 读已提交:有行级锁,没有间隙锁,读不到未提交的数据
- 可重复读:有行级锁,也有间隙锁,每次读取到的数据都是一样的,并且没有幻读的情况(有可能出现幻读)
- 序列化:有行级锁,也有间隙锁,读表的时候,就已经上锁了
间隙锁的作用:保证某个间隙内的数据,在锁定的情况下不会发生任何改变
隐式提交
DQL:查询语句
DML:写操作
DDL:定义语句(建表,建库,修改表,索引,存储过程,视图)
DCL:控制语言(授权)
DDL:都是隐式提交
隐式提交:执行语句相当于执行commit;
,建库,修改表,索引,存储过程,视图)
DCL:控制语言(授权)
DDL:都是隐式提交
隐式提交:执行语句相当于执行commit;