事务
事务(transaction):一个数据库事务由一条或者多条sql语句构成,它们形成整个逻辑的工作单元
这些sql语句要么全部执行成功,要么全部执行失败
事务是保证数据的完整性和一致性的重要手段
START TRANSACTION / BEGIN
SELECT ...
UPDATE ...
INSERT ...
COMMIT / ROLLBACK
COMMIT:提交,让缓存里的数据写到磁盘
ROLLBACK:回滚,撤销操作,在缓存里删除数据
事务类型
- DML事务:由一条或者多条DML语句构成
- DDL事务:总是由一条DDL语句构成
- DCL事务:总是由一条DCL语句构成
事务的4个特性:ACID
-
原子性(Atomicity)
原子的概念就是不可分割,事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 -
一致性(Consistency)
事务执行的结果必须是使数据库从一个状态变到另一个状态 -
隔离性(Isolation)
一个事务的执行不能被其它事务干扰,解决并发带来问题 -
持续性(Durability)
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,写到磁盘中去
四个特性中,原子性是基础,一致性是约束条件,隔离性是手段,持久性是目的
并发事务的四个问题
在介绍事物的四个隔离级别之前,先说一下并发事务会带来的4个问题,并做简单介绍
- 脏读
- 不可重复读
- 幻读
- 丢失更新
脏读:一个事务看到了另一个事务未提交的更新数据;当事务读取尚未提交的数据时,就会发生这种情况
不可重复读:在同一事务中,两次读取同一数据,得到内容不同,也就是有其他事务更改了这些数据
幻读:在同一个事务中,同样的条件,第1次和第2次读出来的记录数不一样
丢失更新:一个事务的修改覆盖了另一个事务所做的修改
事务的四个隔离级别
- read uncommitted:读未提交
四个都允许,隔离最低级别,并发性最高 - read commited:读已提交
不允许脏读,并发性很好,再要求并发高的场景中时常使用 - repeatable read:可重复读
默认的隔离级别,只允许丢失更新,隔离性和并发性都很好 - serializable:顺序读
隔离最高级别,并发性最差
事务强制顺序执行,避免了事务间的冲突,就不会发生并发事务问题