一、事务
1.概念
事务指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。
2.ACID
- 原子性
事务不可分割,要么成功提交,要么失败回滚。回滚由回滚日志实现(Undo Log),记录事务的修改操作,回滚时反向操作。 - 一致性
事务执行前后保持一致,所有事务对同一个数据的读取结果是相同的。 - 隔离性
某事务修改后提交前,对其他事务不可见。 - 持久性
一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
系统发生奔溃可以用重做日志(Redo Log)进行恢复,从而实现持久性。与回滚日志记录数据的逻辑修改不同,重做日志记录的是数据页的物理修改。
四大特性关系:
- 一致性成立,事务执行结果才正确;
- 无并发时,事务串行执行,满足隔离性,此处只要满足原子性,就满足一致性;
- 有并发时,多事务并行执行,事务需满足原子性和隔离性,才可进一步满足一致性;
- 事务满足持久化操作是为应付系统奔溃。
3.AutoCommit
MySQL 默认采用自动提交模式。也就是说,如果不显式使用START TRANSACTION语句来开始一个事务,那么每个查询操作都会被当做一个事务并自动提交。
二、并发一致性
1.原因及解决方法
原因:事务隔离性难以保证。
方法:通过并发控制来保证隔离性。
ps:并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
2.丢失数据
T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。
先来后到——后到者胜。
3.读脏数据
T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。
先改后撤——读取了后撤者。
4.不可重复读
T2 读取一个数据,T1 对该数据做了修