1、 事务概述
- 事务的四个属性
在数据库应用程序中,事务是一个比较常见的概念,它是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为ACID(原子性、一致性、隔离性和持久性)属性,只有具备这些属性才能成为一个事务。
- 原子性
原子性决定事务不可分割,事务必须是原子工作单元,对于其数据所作的修改必须是全执行或全不执行。
- 一致性
事务在完成时必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时所有的内部数据结构(如B树索引或双向链表)都必须是正确的。
- 隔离性
由并发事务所作的修改必须与其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据,这称为可串行性,因为它能够重新装载起始数据,并且回滚一系列事务,以使数据结束时的状态与原始事务执行的状态相同。
- 持久性
事务完成之后,它对于系统的影响是永久性的,即使出现系统故障,事务所作的修改也将一直保持。
在事务的上述特点中,我们最关心的是其隔离性和原子性。
隔离性控制确保两个用户不能更改同一数据,或者一个用户不能在另一个用户对数据操作完成之前对其进行更改。
原子性确保事务中所有步骤都作为一个组成功地完成。如果一个步骤失败,则不应完成其它步骤。
这种事务处理机制由数据库管理系统(DBMS)提供,SuperMap SDX + 支持此种模式的事务处理,即短事务处理机制。
- 短事务的局限性
短事务处理机制虽然具有灵巧高效的优点,但也存在一定的局限性:
- 事务要尽可能简短
短事务处理机制适用于联机事务处理的数据库应用程序,通常,这种应用程序有大量的用户同时执行更改实时数据的事务。虽然用户对数据的单个请求一般只引用少量记录,但是这些请求有许多是同时发生的,这要求尽可能使事务保持简短。
启动事务后,DBMS必须将很多资源锁定并控制到事务结束,以保护事务的ACID属性。如果修改数据,DBMS会用排它锁保护修改过的行,以防止任何其它事务读取该行,并且会将排它锁控制到提交或回滚事务时为止,尽管编辑的可能只是某一行或某几行,但这种锁定是在表一级的,所以,在此期间,别的用户将不能访问正在编辑的表(可以设置事务隔离级别以访问正被锁定的表,但那样会导致其他的诸如并发性的问题)。
所以在用户数量较多的系统中,必须尽可能使事务保持简短以减少并发连接间的资源锁定争夺。在用户数量较少的系统中,运行时间长、效率低的事务可能不会成为问题,但是在有用户数量较多的系统中,将不能忍受这样的事务。
由此局限也引发了其他系列局限性:
- 在一个用户对数据进行编辑期间,别的用户不能编辑甚至不能浏览相应的数据集;
- 编辑时间不能太长,至少在关机或重启前必须提交或回滚事务;
- 在事务期间遇突发事件,如断电或死机,将丢失所作编辑。
2、 SuperMap 长事务概述
GIS 有许多与普通 DBMS 应用程序不同的特点,例如,一次编辑中处理数据为一个区域的数据,数据量比较大;一次编辑持续的时间比较长,可以是几天,几个月,甚至更长的时间;在编辑期间允许其他用户浏览相关的数据……,基于这些特点,SuperMap SDX+ 提供了长事务处理机制。
在处理地图数据,尤其是编辑地图数据时,常常会有下面的需求:
- 希望能够锁定图层中某个区域的数据来编辑它,在完成编辑以前其他用户只能看到编辑以前的数据而不能对锁定的数据进行编辑;
- 编辑时间可以是几天,几个月甚至更长的时间;
- 即使遇到突然断电、死机或者其它意外情况也要保证所作的修改不会丢失或被破坏;
- 不管什么时候,如果对于所作的修改不满意,可以回滚所作的修改,恢复到原来状态;
- 一旦提交了所作的修改,其他用户立即能看到所作的修改;
- 只有在提交了修改或作了回滚后,其他用户才可以对原锁定区域进行修改。
SuperMap长事务可以很好地满足这些需求。
如下表所示为SuperMap长事务和短事务的比较表:
特征 | SuperMap长事务 | 短事务 |
---|---|---|
是否适用多用户并发操作 | 是 | 否 |
编辑时间 | 长,可以是几天、几个月或更长 | 短 |
遇突发事件 | 能保证已作的修改不会丢失或被破坏 | 自开始事务以来所作的修改会丢失 |
3、 SuperMap SDX+ 长事务功能模块
长事务的基本操作有三类:检出、检入和撤销检出。
- 检出
CheckOut后,一方面告诉服务器要开始事务处理,标志着事务处理的开始,另一方面锁定了需要处理的数据,从此直到事务结束,其他用户只能浏览而不能编辑这部分数据,且不能看到正在进行的改动。
- 检入
检入时提交用户所作的修改。
调用CheckIn后,其他用户看到的数据是修改后的状态。
- 撤销检出
撤销检出将回滚自开始事务以来所作的修改,数据将恢复到未作修改时的状态。
注意事项
- 在进行长事务处理之前,需要先由数据库系统管理员在服务器端建立长事务用户。例如,在Oracle Enterprise Manager Console中,点击目标数据库列表,展开[方案],选中某一具体的用户,点击展开的[表],找到名称为SMLTUSERS 的表,右键菜单[查看/编辑目录…],打开之后即可添加长事务用户,并为其设置登录密码,也可直接用SQL语句来添加。之后在客户端,如Deskpro中,打开此Oracle数据源,右键点击[登录长事务],输入已建好的用户名和密码即可开始长事务处理操作。
- 目前SDX+ for SQL Server(SQLPlus) 和 SDX+ for Oracle(OraclePlus)引擎支持长事务处理功能。
- 若登录了长事务,但没有检出数据,将不能对数据进行编辑。
- 在长事务环境中,数据定义语言(如创建表,删除表,创建字段,删除字段等)将导致永久性的改变,不能回滚。所以在执行数据定义语言前请先提交或回滚长事务。