一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。
1:原子性(Atomicity,或称不可分割性)
2:一致性(Consistency)
3:隔离性(Isolation,又称独立性)
4:持久性(Durability)
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的默认规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作
隔离性:当两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的相互关系。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的。
如果几个事务要访问相同的数据项,为了保证
数据库的一致性,可以让这几个事务:
①串行执行:即一个接着一个地执行事务;
②并发执行:即同时执行多个事务,但用并发
控制机制来解决不同事务间的相互影响。
事务的提交与回滚:
提交( Commit )
通知事务管理器一个逻辑工作单元已完成,所做的更新操作可以被提交或永久保留
表明事务成功地结束
执行有效性检验
回滚( RollBack)
通知事务管理器事务未能正常完成,数据库可能处于不一致状态,当前事务所做的所有更新操作必须撤消
表明事务不成功地结束
目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式。第二种是Shadow paging。
系统日志的恢复步骤是:
1、反向扫描文件日志(即从最后向前扫描日志文件),查找该事务
的更新操作。
2、对该事务的更新操作执行逆操作。即将日志记录“更新前的值”写
入数据库。这样,如果记录中是插入操作,则相当于做删除操
作;若记录中是删除操作,则做插入操作;若是修改操作,则相
当于用修改前的值代替修改后的值。
3、继续反向扫描日志文件,查找该事务的其他更新操作,并做和2
一样的同样处理。
4、如此处理下去,直至读到此事务的开始标记,事务的故障恢复就
完成了。
并发的问题:
现有两处火车票售票点,同时读取某一趟列车车票数据库中车票余额为 X。两处售票点同时卖出一张车票,同时修改余额为 X -1写回数据库,这样就造成了实际卖出两张火车票而数据库中的却记录只少了一张。
产生这种情况的原因是因为两个事物读入同一数据并同时修改,其中一个事物提交的结果破坏了另一个事物提交的结果,导致其数据的修改被丢失,破坏了事物的隔离性。并发控制要解决的就是这类问题。
先查一下锁的概念:
封锁是一项用于多用户同时访问数据库的技术,是实现并发控制的一项重要手段,能够防止当多用户改写数据库时造成数据丢失和损坏。当有一个用户对数据库内的数据进行操作时,在读取数据前先锁住数据,这样其他用户就无法访问和修改该数据,直到这一数据修改并写回数据库解除封锁为止。
解决方法:
悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作都某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。
悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。
观并发控制实际上是“先取锁再访问”的保守策略[1],为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外,在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载;还有会降低了并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。
乐观并发控制(又名“乐观锁”,Optimistic Concurrency Control,缩写“OCC”)是一种并发控制的方法。它假设多用户并发的事务在处理时不会彼此互相影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,有没有其他事务又修改了该数据。如果其他事务有更新的话,正在提交的事务会进行回滚。乐观事务控制最早是由孔祥重(H.T.Kung)教授提出[1]。
乐观并发控制多数用于数据争用不大、冲突较少的环境中,这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其他并发控制方法更高的吞吐量。
乐观并发控制的事务包括以下阶段:[来源请求]
乐观并发控制相信事物之间的数据竞争(data race)的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。但如果直接简单这么做,还是有可能会遇到不可预期的结果,例如两个事务都读取了数据库的某一行,经过修改以后写回数据库,这时就遇到了问题
熟悉一下时间戳的概念以及时间戳的精度:
时间戳(英语:Timestamp)是指在一连串的资料中加入辨识文字,如时间或日期,用以保障本地端(local)资料更新顺序与远端(remote)一致。
时间戳的范例如下:
2005-10-30 T 10:45 UTC 2007-11-09 T 11:20 UTC Sat Jul 23 02:16:57 2005UTC世界协调时:采用国际原子时进行计算: