代码改变世界

数据库系统中的事务及事务的并发执行的分析

2017-06-12 16:54  DataBases  阅读(1765)  评论(0编辑  收藏  举报

数据库中一些操作的集合通常被认为是一个单元。
事务是访问并可能更新各种数据项的一个程序执行单元;通常有高级数据操纵语言或编程语言(SQL,C++,Java)编写的用户程序的执行所引起的,使用begin transaction 和 end tansaction语句来界定;由事务开始(begin transaction)与事务结束(end transaction)之间的所有操作组成。
为了保证数据完整性,要求数据库系统维护事务的以下性质:
原子性(automicity):事务的所有操作在数据库中要么全部正确执行,要么全部不执行;MVCC实现。
一致性(consistency):隔离执行事务时保持数据库的一致性;约束,主键,外键等实现。
隔离性(isolation):尽管多个事务可能并发执行,每个事务都感觉不到系统中有其他事务在并发执行;MVCC实现。
持久性(durabilitiy):一个事务成功完成后,它对数据库的改变是永久的,即使系统可能出现故障;WAL实现。
事务状态
在不出现故障的情况下,所有的事务都能成功完成。事务并非总能顺利执行完成。这样的事务称为中止事务(aborted)。
要确保原子性,中止事务必须对数据库的状态不造成影响。中止事务对数据库所做过的任何改变必须撤销。
一旦中止事务造成的变更撤销,称为事务已回滚(rolled back)。恢复机制负责管理事务中止。

成功完成执行的事务称为已提交事务(committed)。一个对数据库进行过更新的已提交事务使数据库进入一个新的一致状态,
即使出现系统故障,这个状态也必须保持。
一旦事务已提交,不能通过中止它来撤销其造成的影响。撤销已提交事务所造成影响的唯一方法是执行一个补偿事务(compensating translation)。
书写和执行补偿事务的责任由用户来执行,而不是有数据库系统处理。
事务的状态:
活动的状态(activity):初始状态;事务执行时处于这个状态。
部分提交状态(partially committed):最后一条语句执行后。
失败状态(failed):发现正常的执行不能继续之后。
中止状态(aborted):事务回滚并且数据库已恢复到事务开始执行前的状态之后。
提交状态(committed):成功完成后。

并发执行
事务处理系统通常允许多个事务并发执行。允许多个事务并发更新数据引起许多数据一致性的问题。
在存在事务并发执行的情况下保证一致性需要进行特殊处理;如果要求事务串行执行,就简单了。
事务串行执行就是一次执行一个事务,每个事务只有当前一事务执行完后才开始。
为什么需要并发执行?
1.提高吞吐量和资源利用率:
一个事务由多个步骤组成,一些步骤涉及I/O活动,另一些涉及CPU活动。计算机系统中CPU与磁盘可以并行运作。
因此,I/O活动可以与CPU处理并行执行。利用CPU与I/O系统的并行性,多个事务可以并行执行。当一个事务在一个磁盘上
进行读写时,另一个事务可在CPU上运行,同时第三个事务由可以在另一个磁盘上进行读写。从而系统的吞吐量(throughout)增加,
即给定时间内执行的事务数增加。相应的处理器与磁盘利用率也提高;处理器与磁盘空闲时间较少。

2.减少等待时间:
系统中可能运行着各种各样的事务,短事务,长事务。如果事务串行执行,短事务可能要等待它前面的长事务完成,这可能导致难以预测的延迟。
如果哥哥事务是针对数据库的不同部分进行操作,事务并发执行会更好,各个事务可以共享CPU周期与磁盘存取。并发执行可以减少不可预测的事务延迟执行。
并行执行也可以减少平均响应时间(average response time),即一个事务从开始到完成所需的平均时间。
在数据库中使用并发执行的动机本质上与操作系统中使用多进程的动机是一样的。