MySQL 事务
事务的特性:
- 原子性:不可再分,要不都做,要不都不做
- 隔离性:事务相互之间是不可见的
- 持久性:事务一但提交,服务器岩机也是可以恢复
- 一致性:事务的操作不会改变数据的状态,譬如,数据一致性
事务的类别:
- 扁平事务
所有操作都处于同一层次,其由BEGIN WORK 开始,由COMMIT WORK或ROLLBACK WORK结束,其间的操作都是源自的,要么执行,要么都回滚,因此扁平事务是应用程序为原子操作的基本组成模块
- 带有保存点的扁平事务
除了支持扁平事务支持的操作外,允许在事务执行过程中回滚同一事务中较早的一个状态。
隐式的设置了一个保存点
- 链事务
在提交一个事务时,释放不需要的数据对象,将必要在处理上下文隐式地传给下个要开始的事务,提交事务和开始事务操作将合并为一个原子操作
这意味着下一个事务将看到上一个事务的结果,就好像一个事务中进行的一样
与带有保存点的扁平事务不同的是:带有保存点的扁平事务能回滚到任意正确的保存点,而链式事务只能回滚到最近的一个保存点
- 嵌套事务
1 嵌套事务是由若干事务组成的一棵树,子树既可以是嵌套事务也可以是扁平事务
2 处在叶节点的事务是扁平事务,但是每个事务从根到叶节点的距离可以说是不同的
3位于根节点的事务称为顶层事务,其他称为自事务。事务的前驱称(predecessor)为父事务(parent),事务的下一层称为儿子事务(child)
4 子事务既可以提交也可以回滚。但是它的提交操作并不马上生效。除非其父事务已经提交。因此可以推论出,任何子事务都在顶层事务提交后才真正的提交
5 树中的任意事务回滚会引起它的所有子事务一同回滚,故子事务仅保留ACI特性而不具有D特性
- 分布式事务
分布式事务 通常是一个分布式环境下运行的扁平事务,因此需要根据数据所在位置访问网络中的不同节点
隔离级别:
- 读取未提交内容(脏读):事务A读取了事务B更新的数据,然后事务B回滚操作,那么事务A读取的数据是脏数据
- 读取提交内容(不可重复读):事务A多次读取同一数据,事务B在事务A多次读取的过程中对数据进行了修改,导致多次读取的数据不一致
- 可重读(幻读):它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
- 可串行化:这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争