一、引言
一项事务(Database Transaction) 相比于数据库,是指作为数据库系统中单个逻辑工作单元执行的一系列操作。事务之间相互独立。事务在数据库系统中主要用于:
1.提供可靠的逻辑工作单元保证数据库的可恢复性(原子性),及数据库的一致性。
2.保证并发程序间访问数据库具有隔离性。
由定义:一项数据库事务必须具有:原子性(atomic),一致性(consistent),隔离型(isolated)及持久性(durable)。DBA经常将其简称为ACID.
原子性保证数据库或其他数据存储事务执行具有“all-or-nothing”性质即要么完整的执行要么不执行。隔离性保证不同事务间的执行互不相干。一致性保证结果符合数据库存储约束条件:Unique,reference(外键),primary key(主键)。持久性保证数据存储的持久性。
二、数据库约束条件
1.主键(primary key):标识数据元组的键,必须满足值不为null,一张表中有且只有一个主键。
2.特殊键(unique key):指对数据库元组中0~n(n<元组属性个数)个属性设置后保证该属性值在数据库表中唯一。在数据库索引中默认为唯一索引(unique index)。值可以为null
3.外键(reference key):用于标识被引用表(父表)中的唯一元组。值为空或者为被引用表(父表)的候选键(多为主键).
plus:特殊键集合是数据元组的候选键,从候选键中挑选其一作为数据元组主键。来自不同表之间的元组用外键进行索引。
键名 | 释义 |
Simple(简单键) | 由元组中一个属性组成的键。例:(simple key) |
Concatenated(串联键) | 由元组中至少两个属性(Simple键)串连而成的单个键。例:(simple key_simple key) |
Compound(混合键) | 由元组中至少两个属性(Simple键)混合成的键。例:(simple key,simple key) |
Composite(组合键) | 由元组中至少1个混合键并至少一个Simple键组合而成的键。例:((simple key,simple key),simple key) |
Natural(自然键) | 不利用本数据库中元组属性来生成键,直接由外部来定义生成。 |
Surrogate(代理键) | 由数据库系统生成的键或当生成时取决部分候选键的生成。多为数字ID,主要用于提高运行效率。 |
Candidate(候选键) | 候选键 |
Primary(主键) | 在系统实现中多用该键来查询数据表及不同表之间进行连接 |
Alternate(可选键) | 除主键外可以用来标识元组的键。为单张表中除主键外可利用来查询元组的键。 |
Foreign(外键) | 本张表中引用的同一数据库里的另一张表里的特殊键(它们的值相同)。 |
三、事务型数据库
事务型数据库指数据库管理系统,当在数据库中写入事务在执行未完成时支持回滚。现今的大多数关系型数据库管理系统都支持事务。
在数据库系统中,一项事务可以包含多条数据操作(读,写)。使用数据库系统的用户以保证数据的一致性和完整性作为数据库的衡量指标。数据库事务执行(SQL)的通用范式为:
1.执行事务(Begin the transaction)。
2.执行属于事务的一系列数据操作(读写)。
3.如果事务执行过程未遇到错误则提交并正常终止事务。
4.如果遇到错误则回滚事务并终止事务。
实现上,多用户的数据库存储和处理事务,经常通过为每项事务分配一个ID.
其他实现方式:
嵌套事务:在一个已有事务范围内嵌套的事务。可以有不同的实现方式,但他们有共同点即在最外层事务未结束之前不相关事务间的隔离性,这意味着嵌套事务不一定是必须要持久化更新数据到数据库中。
四、并发控制
广义的并发控制用于提供规则(rules),设计理论和方法来保证不同组建交互时并发操作的数据一致性(consistency)和正确性(correctness),乃至保证整个系统的一致性和正确性。在系统中引入并发控制会降低整个系统的运行效率,所以设计并发控制时在保证操作的一致性和正确性的同时,尽量提高程序的运行效率。
并发控制在数据库管理系统中保证事务的运行不会破坏数据的完整性约束。理论;序列化理论(serializability theory)及原子性事务(atomic transction 1993)。在数据库实现中多运用序列化理论。为了保证数据的正确性,DBMS保证只有序列化的事务才会被执行。
1.为什么需要并发控制?
如果事务的执行是序列化的即顺序的执行没有时间上的叠加,那么就不存在事务的并发。然而,为了提高系统的运行效率,允许对数据库交叉读写的并发操作,这导致读写操作的不可控同时一些未期望的结果的发生。比如:
i.丢失更新问题:时间序列上,第二个写数据事务在第一个写数据事务后执行。例:假如3个事务(t1,t2,t3)并发,两个写,一个读。顺序执行情况下为(t1写,t2读,t3写),由于并发情况无法保证事务在时间上的顺序,出现了(t1写,t3写,t2读)的情况。多出现在数据库数据更新的情况下。
ii,读脏数据问题:时间序列上,第二个读操作在第一个删除操作前执行。例:加入2个事务(t1,t2)并发,一个删除,一个读。顺序执行情况下为(t1删除,t2读),并发情况下:(t2读,t1删除)
iii,不正确的总结问题:两个事务并发,一个事务用于总结数据库有多少相同属性值的元组,另一个事务写数据,写的操作可以在总结完前写入,也可能在总结后写入。这导致总结的数据是一个随机值。
2.并发控制机制
乐观锁:在事务执行完后再对事务并发的隔离性和完整性进行检验,如果不满足事务的约束条件则,则挑选出之前已被遗弃某些事务重新再执行。应用场合:重复执行的事务量比较小。
悲观锁:如果一项事务的执行不满足并发控制的条件(隔离型和完整性约束),则对其进行加锁直到该事务满足并发控制条件时才释放锁。
半乐观锁:对并发控制的一部分条件加悲观锁,另一部分条件加乐观锁。
当两个事务之间相互加锁(相互之间,一个对另一个加锁)容易引发死锁。死锁问题的解决多为开一个驻留事务解除死锁,并迅速重新开启,重新执行。
2.1 锁(如:两阶段锁-Two Phase Locking 2PL)对控制写的事务的对数据进行加锁;对一个事务加锁的另一事务也可能被加锁。
2.2序列化图检查。检测事务调用图是否构成环,若构成通过放弃某些事务来解除死循环造成的死锁。
2.3 根据时间戳进行排序。给事务分配时间戳,并对数据并发的事务按时间戳来进行排序分配资源。
2.5 根据提交顺序。
2.6 多版本并发控制。
五、参考:
http://en.wikipedia.org/w/index.php?title=Database_transaction&oldid=521605403
http://en.wikipedia.org/wiki/Unique_key
http://en.wikipedia.org/wiki/Foreign_key
http://en.wikipedia.org/wiki/Nested_transaction
http://en.wikipedia.org/wiki/Concurrency_control