1、从用户观点看,数据库中一些操作的集合被认为是一个独立单元。
2、事务:构成单一逻辑工作单位的操作集合。(ACID特性)
即使有故障,数据库系统也必须保证事务的正确执行——要么执行整个事务,要么属于该事务的操作一个也不执行。
3、事务是访问并可能更新各种数据项的一个程序执行单元。事务用形如begin transaction和end transcation语句(或函数调用)来界定。事务由以上两者之间执行的全体操作组成。
4、原子性:
事务是不可分割的,所以要么执行其全部内容,要么根本就不执行。
5、隔离性:
数据库系统必须采取特殊处理来确保事务正常执行而不被来自并发执行的数据库语句所干扰。
6、持久性:
系统能保证一个事务的正确执行,即使崩溃后事务的操作也必须是持久的。
7、一致性:
如果一个事务作为原子从一个一致的数据库状态开始独立的运行,则事务结束时数据库也必须再次是一致的。
8、存储结构:
1)稳定性存储:其中的信息永远不会丢失。
2)非易失性存储器:信息会在系统崩溃后幸存。
3)易失性存储器:信息在系统崩溃后不会幸存。
为了一个事务能够持久,它的修改应该写入稳定性存储器。同样,为了一个事务是原子的,日志记录需要在对磁盘上的数据库做任何修改之前写入稳定性存储器。
9、中止:事务未能成功执行完成。
中止事务对数据库所做过的任何改变必须撤销。一旦中止事务造成的变更被撤销,我们就说事务已回滚。恢复机制负责管理事务中止。
典型的方法是维护一个日志。每个事务对数据库的修改都首先会记录到日志中。我们记录执行修改的事务标识符、修改的数据项标识符以及数据项的旧值(修改前的)和新值(修改后的)。然后数据库才会修改。
10、已提交:成功完成执行的事务。
一个对数据库进行过更新的已提交事务是数据库进入一个新的一致状态,即使出现系统故障,这个状态也必须保持。11、一旦事务已提交,我们不能通过中止它来撤销其造成的影响。唯一方法是执行一个补偿事务。
12、事务的五种状态:
1)活动的:初始状态,事务执行时处于这个状态。
2)部分提交的:最后一条语句执行后。
3)失败的:发现正常的执行不能继续后。
4)中止的:事务回滚并且数据库已挥发到事务开始执行之前的状态后。
5)提交的:成功完成后。
13、系统判定事务不能继续正常执行后(如,由于硬件或逻辑错误),事务就进入失败状态。这种事务必须回滚。这样事务就进入中止状态。此刻,系统有两种选择:
1)它可以重启事务,但仅当引起事务中止的是硬件错误或不是由事务的内部逻辑所产生的软件错误时。重启的事务被看成是一个新事务。
2)它可以杀死事务,这样做通常是由于事务的内部逻辑造成的错误,只有重写应用程序才能改正,或者由于输入错误,或所需数据在数据库中没有找到。
14、事务隔离性:
1)事务处理系统通常允许多个事务并发地执行。
串行地:一次执行一个事务,每个事务仅当前一事务执行完成后才开始。
并发:提高吞吐量和资源利用率。减少等待时间。
2)当数据库系统并发地执行多个事务时,相应的调度不必是串行的。
3)串行化顺序可通过拓扑排序得到,拓扑排序用于计算与优先图的偏序相一致的线性顺序。
15、级联回滚:因单个事务故障导致一系列事务回滚的现象。
16、SQL标准规定的隔离性级别如下:
1)可串行化:通常保证可串行化调度。
2)可重复读:只允许读取已提交数据,而且在一个事务两次读取一个数据项期间,其他事务不得更新该数据。但该事务不要求与其他事务可串行化。
3)已提交读:只允许读取已提交数据,但不要求可重复读。
4)未提交读:允许读取未提交数据。这是SQL允许的最低一致性级别。
注意:以上所有隔离性级别都不允许脏写,即如果一个数据项已经被另外一个尚未提交或中止的事务写入,则不允许对该数据项执行写操作。
许多数据库系统运行时的默认隔离性级别是已提交读。
修改隔离性级别必须作为事务的第一条语句执行。
17、锁:
一个事务可以封锁其访问的数据项,而不用封锁整个数据库。通常只有当事务完成所有操作并且提交或中止时才释放锁。(一次只能执行一个事务)
共享锁用于事务读的数据项,排他锁用于事务写的数据项。
许多事务可以同时持有一个数据项上的共享锁,但是只有当其他事务在一个数据项上不持有任何锁(无论是共享锁还是排他锁)时,一个事务才允许持有该数据项上的排他锁。
18、时间戳:
通常在事务该开始时为其分配。对于每个数据项,系统维护两个时间戳。数据项的读时间戳记录该数据项的事务的最大(即最近的)时间戳。数据项的写时间戳记录写入该数据项当前值的事务的时间戳。
时间戳用来确保在访问冲突情况下,事务按照事务时间戳的顺序来访问数据项。当不可能访问时,违例事务将会中止,并且分配一个新的时间戳重新开始。
19、快照隔离:
当一个事务T进入部分提交状态后,只有在没有其他并发事务已经修改该事务想要更新的数据项的情况下,事务进入提交状态。而不能提交的事务则中止。
快照隔离可以保证读数据的尝试永远无需等待(不像封锁的情况)。只读事务不会中止,只有修改数据的事务有微小的中止风险。
20、幻象现象:
如果在事务多次运行之间数据库发生改变,那么即使是同一个事务,在多次不同运行中也可能会使用不同的数据项。