首页 > Linux操作系统 > Linux操作系统 > informix 的数据一致性
Informix 进程隔离级(isolation level)
隔离级是指并发执行相同操作的进程相互隔离的程度。OnLine通过设定进程在读操作时上锁的不同规则而提供了四种隔离级:Dirty Read(脏读)隔离、Committed Read(提交后读)隔离、Cursor Stability(游标固定)隔离和Repeatable Read(可重复读)隔离具体说明如下:
1、Dirty Read(脏读)隔离
Dirty Read是最简单的隔离级,类同于无隔离级当进程在读数据据时并不对所读的数据上锁,也不管其他进程上没上锁或在做什么。
2、Committed Read(提交后读)隔离
当进程请求Committed Read隔离级时,OnLine保证进程得到的数据不是数据库未提交的数据即此时没有其他进程在对这些数据做修改。
3、Cursor Stability(游标固定)隔离
当进程使用Cursor Stability隔离级时,OnLine对进程最后获取的一行数据上锁,对普通的游标上一个共享锁,而对修改游标一个升级锁(更新锁)。
4、Repeatable Read(可重复读)隔离
Repeatable Read隔离级请求数据库服务器对进程读到的每一行数据都加锁为普通的游标加上共享锁而为修改游标上更新锁这些锁直到游标关闭或事务结束时才释放。Repeatable Read允许用户使用滚动游标对所选择的数据多次读取并保证这些数据没有被修改或被删除。用户设置隔离级的方法是用“Set Isolation To isolationlevel”SQL语句,其中isolationlevel是Dirty Read、Committed Read、Cursor Stability和Repeatable Read之一。在Informix-4gl、ESQL/C、SQL中均可以使用
如果说高可用性能保证系统级的完整性,那么数据的一致性是在事务级保证完整性。INFORMIX动态服务器通过事务日志和内部一致性检查、创建和加强封锁过程、隔离级别和业务规则来保证数据的一致性。
事务日志
如果一个操作不能完成,则已经完成的那部分事务必须从数据库中清除,以保持数据的一致性。为了清楚部分完成的事务,INFORMIX动态服务器在逻辑日志中对所有事务的历史记录进行维护,并以这些事务记录作为依据,将数据库恢复到事务之前的状态。
内部一致性检查
内部一致性检查为提醒管理员数据或系统的不一致状态而专门设计。INFORMIX动态服务器包含一个数据级的检查机制,它能够发现由于硬件或操作系统故障而引起的数据不一致。如果发现了不一致,该内部机制就自动向INFORMIX动态服务器消息日志发消息。
为了更好地确定不一致的原因,INFORMIX动态服务器管理员可以指导用户来设置一致性检查环境变量,这些变量产生诊断结果(例如,在不一致发生的共享内存中的内容),来帮助确定不一致发生的原因。
封锁和处理的独立性
为了保持数据的一致性,所需的另一个重要的功能是封锁过程和处理的独立性。这些安全性措施保护当前正在被访问或修改的数据不会被其它用户更改。
封锁
数据库服务器引入封锁机制来防止错误的发生。锁是一个程序加在数据片断上的声明或限制。数据库服务器保证只要数据是被封锁的,其它任何数据库服务器进程都不能对其进行修改。当另一数据库服务器程序要求对该数据库进行修改时,数据库服务器使该程序要么等待,要么返回一个错误。
INFORMIX动态服务器还能防止死锁的发生。死锁是两个用户都封锁着另一个用户所等待得数据。例如,用户A封锁了一个元组,并且在用户A访问B所封锁的数据之前不会将其释放。INFORMIX动态服务器能立即检测到死锁的发生,并向第二个程序发出出错消息,以防止死锁状态的出现。 一个表或事务的吞吐量会受封锁策略的影响。使用排它锁对数据进行访问的应用会发现其它的数据库服务器进程都在花时间等待对数据进行访问。因此,INFORMIX动态服务器提供了几个不同级别的封锁。数据库服务器可以在单个记录、页面、表和数据库的级别上加锁。
在创建表和改变表结构时,可以指定记录和页面级别的封锁。在用户应用中可以指定表和数据库级别的封锁。
隔离级别
隔离级别是读操作独立于其它并发数据库服务进程的程度;其它进程可以对你正在读的记录进行什么修改,以及你可以对其它进程正在读或修改的哪些记录进行读操作。
隔离级别只能影响读操作,它们不作用于其它的语句,如插入,删除,更新等。INFORMIX动态服务器有四个隔离级别:脏读、提交读、游标的稳定性、以及重复读。
脏读是隔离级别中最简单的一个,它实际上根本没有提供任何独立性。当一个程序使用脏读来访问数据时,它不加锁。对于脏读,用户可以读任何数据,包括以提交的未提交的。
提交读保证INFORMIX动态服务器只能读提交给数据库的记录。在对记录进行访问之前,数据库服务器检查是否有更新进程给该记录加了锁。如果没有加锁,数据库服务器就对该数据进行访问。提交读保证数据库服务器不会读未提交的数据,因为在作了修改而又没有提交的记录上加了锁。
下一个隔离级别是游标的稳定性。使用游标的稳定性时,数据库服务器在所读的最新记录上加上锁。每次仅对一个记录加锁;每当读新的记录时,就将原来的锁释放。这个孤立级别保证程序在读的当前的记录不会被改变。
重复读保证在读操作过程中,所得到的结果与在该事务中其它时刻得到的结果是一致的。重复读不仅在所读的记录上加共享锁,而且还阻止其它用户违反数据库的读锁标准向数据库中增加记录或更新记录。
业务规则
业务规则能增强字段级的数据一致性,这些规则指定数据可能的值、列的缺省值,以及列与列之间的关系。 业务规则必须由对数据进行访问和操作的应用来限定。但是,INFORMIX动态服务器不依赖于应用来实现这些规则。实际上,INFORMIX动态服务器可以独立实现这些规则。责任的集中减轻了用户应用的负担,并保证了业务规则的继承性。
INFORMIX动态服务器支持完整性约束、存储过程和触发器,从而保证业务规则。
完整性约束
INFORMIX支持ANSI SQL的完整性约束,保证信息不会被不当地删除,插入的数据满足字段的特殊要求。INFORMIX动态服务器提供两种类型的完整性约束:参照完整性和实体完整性。
参照完整性允许用户定义和保证字段之间的关系。例如,INFORMIX动态服务器的参照完整性可以保证,对于主表中有关的一个实体的信息,如果在子表中存在相应的信息的话,那么主表信息不会被删除。这就保证不会在某客户的订单存在的情况下将该客户删除。
实体完整性为特定字段规定合法取值范围。这样的检查允许DBA对所允许的值的范围作出规定。缺省值允许用户指定符合字段数据类型的任何智值作为缺省值。
存储过程 存储过程是以命名过程的形式存储在数据库中的SQL命令和编程语句,以保证常用操作的一致实现。存储过程在数据库中,而不是在应用程序中对常用的优化过的应用例程进行维护。 存储过程减少数据库操作所需要的网络流量。因为存储过程可在一个命令中处理多个任务(如插入、更新和删除)。在处理请求之后,存储过程仅返回满足条件的结果,而不是每一个查询结果的集合。
触发器
触发器是唤醒存储过程的另一种方法。与应用程序调用存储过程来实现业务规则的方法不同,触发器可以被定义为:在需要进行插入、删除、和更新的时候,启动数据库服务器自动执行存储过程(或SQL语句)。
由于触发器是存储在系统数据字典中的,因此不需要应用程序来完成维护触发器代码。同样,由于无法绕过触发器,所以跨所有事务的完整性约束也得到了保证。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21634752/viewspace-614062/ ,如需转载,请注明出处,否则将追究法律责任。