抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

事务并发

某些突发故障可能导致数据库产生不一致的结果;并发执行应用可以提高性能,但是有可能带来数据操作结果不符合预期 数据库的更新:

  • 读数据库:将数据库中数据先从磁盘读入内存,然后再将值赋予另一个变量;
  • 写数据库:现将变量的值写入内存,然后再有内存写入磁盘;
  • 数据库更新应该权衡减少在磁盘上的I/O&防止数据不一致

概念

事务是用户定义的一个数据库操作序列

  • 这些工作是原子的,要么全做,要么全不做,是不可分割的工作单位;
  • 一个事务可以是一条SQL语句,一组SQL语句或整个程序
  • 一个应用程序可以包含事务

定义

在SQL中可以显式定义

BEGIN TRANSACTION 
	<SQL1>
	<>
	COMMIT|ROLLBACK
END TRANSACTION

没有显式定义事务时,DBMS按缺省方式自动划分事务

特性ACID

  • 原子性Atomicity:
    • 事务的所有操作在数据库中要么全部正确反映,要么全部不反应;
    • 系统崩溃后,DBMS将恢复或撤销系统崩溃前处于活动状态的事务对数据库产生的影响,从而保证事务的原子性
    • 事务管理部件处理
  • 一致性Consistency:
    • 事务完成时,必须所有数据具有一致的状态;
    • 一般由开发者确保
  • 隔离性Isolation:
    • 当多个事务并发执行时,一个事务的执行不能被其他事务干扰
    • 解决前面提到的并发执行带来的错误问题
    • 交错调度的效果应该和某个串行调度结果是一致的
    • 并发控制部件处理
  • 持续性Durability:
    • 一个事务一旦提交,它对数据库中的数据的改变应该是永久性的,即使系统可能出现故障
    • 恢复管理部件负责

事务并发

概念

并发执行的优点:改善系统的资源利用率,减少短事务的等待时间 调度:一个或者多个事务的操作按时间排序的一个序列 不受控制的事务调度问题:

  • 丢失更新
  • 读脏数据
  • 不可重复读
  • 幻读

原因:事务ACID特性中隔离性被破坏

隔离级别

如何实现事务隔离?

  • 串行:每个事务一次顺序执行
  • 并行但控制:事务之间并发执行,收到DBMS调整事务调度
隔离级别 丢失更新 读脏数据 不可重复读 幻读
读未提交 解决
读提交 解决
重复读 解决
序列化 解决

读未提交Read Uncommitted

一个事务可以读取另一个未提交事务的数据

读提交Read Committed

一个事务要等另一个事务提交后才能读取数据

重复读Repeatable Read

在开始读数据时,不允许修改操作

序列化Serializable

最高的事务隔离级别,事务在这个级别下串行化执行,在该级别下性能最低

可串行化调度

概念

事务交叉调度结果与某一个串行调度结果相同 调度可串行化意味着保持着数据库的一致性,DBMS需要事务调度管理

  • 事务并发完全交给操作系统并不可靠
  • 调度不一定能保持数据库一致
  • DBMS对事务运行加以控制,确保一致性

数学化表示

操作 简写
读READ R
写WRITE W
事务T写数据库元素x WT(x)
事务T读数据库元素x RT(x)
调度(事务序列) S = ….

指令冲突

指令冲突性:调度中两个事务发生冲突,意味着

  • 必须对同一数据对象进行操作
  • 两个指令有一个写操作

冲突等价:对于调度S中属于不同事务的两条操作指令是不冲突的,则可以交换两条指令的执行顺序,得到一个新的调度S‘,称两个调度冲突等价

冲突可串行化:若一个冲突等价于一个串行调度,则这个调度是冲突可串行化的;

  • 冲突可串行是可串行性的充分条件

视图等价:对于同一事务集,若两个调度视图等价

  • 在任何事务保证美俄事务读取相同的值,
  • 写入数据库最终状态也是一样的;

视图可串行化:若某个调度视图等价于一个串行调度,则称这个调度是视图可串行化的;

  • 若调度是冲突可串行化的,则一定是视图可串行化的
  • 反之未必

前驱图precedence graph

定义有向前驱图

  • 顶点为调度S的事务

  • 表示先于对应的指令执行,且二者存在某一对冲突指令

  • 若前驱图存在环,则调度S不是可串行化的;

  • 若前驱图不存在环,表示调度是冲突可串行化的

  • 一个拓扑排序意味调度一个等价的串行调度

评论




博客内容遵循 [署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh)
本站使用 Volantis 作为主题 字数统计:318.5k
<