Informix的事务、并发控制、锁机制、隔离级别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Informix的事务、并发控制、锁机制、隔离级别

1、事务

事务是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。数据库服务器保证在事务范围内执行的操作完整且正确地提交至磁盘,否则数据库会复原至事务启动之前的状态。

一个逻辑工作单元要成为事务,必须满足所谓的ACID属性。ACID的具体含义如下:

1)A(Atomicity):操作序列要么完整的执行,否则什么都不做;

2)C(Consistency):一致性,事务执行后,保证数据库从一个一致性状态到另外一个一致性状态; 3)I(Isolation):隔离,一个事务的中间状态对其他事务不可见,即每个用户都感觉他们在单独使用数据库。隔离级别用来定义多大程度的隔离多个不同的事务;

4)D(Durability):持久性,事务的有效性,不会应用硬件或软件的失败而丢失。

2、并发控制

1)相关概念

i)隔离(+一致性) => 并发控制;

ii)多个事务可以访问或修改相同的资源;

iii)只要多个进程共享资源,就需要对访问进程进行排队控制;

iv)在进行并发控制时,数据库内部将生成多个并发事务访问资源的操作序列表,并且每一个事务内部的各个操作都需要序列化。

2)串行调度存在的问题

在串行调度中,采用操作序列,一个事务完成了再完成另外一个,即使两个事务T1、T2更新的是数据库中不同的对象。此种方式从并发和性能角度考虑,都不能很好的利用计算机资源。

为了改善性能,需要采用非串行调度,即允许事务并发执行,即一个事务内的操作可以在其他事务提交前开始执行。

3)并发调度的常见问题

i)脏读:事务T2读取到了事务T1没有提交的结果

例如如下的操作序列会导致脏读:

事务T1读取记录,然后更新记录;

事务T2读取了更新后的记录;

若T1后续操作失败,会导致更新的记录回滚,而同时事务T2已经使用了这个没有提交的值。

ii)不可重复读:事务T1中多个读操作返回不同的结果

事务T1读取一个对象;

事务T2读取并更新同一个对象;

事务T1再次读取同一个对象返回了不同的值。

iii)幻影读:如果事务T1在同样的情况下多次执行select读取的结果不同

事务T1从一个表中检索满足特定条件的记录返回m条记录;

事务T2往该表中insert/delete其他满足相同条件的记录;

事务T1再次以相同的条件检索该表的数据返回的数据记录不为m条。

3、锁机制

1)相关概念

i)用户可以锁定一个对象,可以防止其它用户修改锁定的对象;

ii)在多个用户并发访问数据库的情况下,为保证数据完整性,锁是很有必要的;

iii)程序可以显式的对数据枷锁,数据库系统可以隐式的对对象进行加锁。

2)锁的类型

i)共享锁(Shared locks):多个用户可以读取相同的记录

如果一个对象上没有排他锁,则共享锁可以加在该对象上,它可以防止其他事务更新数据,但同时,其他事务可以读取该数据,多个事务可以在同一个对象上加多个共享锁。

ii)排他锁(Exclusive locks):同一时间仅仅有一个用户可以读取相同的记录如果一个对象上没有任何锁,排他锁才可以加在该对象上。一旦在记录上加了排他锁,则不能在该记录上增加任何锁了,直至锁释放。它可以防止其他事务读取和更新数据。

iii)提升/更新锁(Promotable/Update lock):可以对锁进行升级或者降级

在更新游标时使用,由游标在含有“for update”选项执行时产生,只能在没有排他锁或其他更新锁的记录上加更新锁。当锁定的记录真正执行的时候,更新锁将提升为排他锁。

iv)专一锁(Intent lock):是一种表级锁,标识在该表上有一个游标在读取数据由IDS自动分配,如果一条记录上的记录被更新,一个排他锁将分配在该记录上,同时将该记录的表上自动加上专一锁,这能保证没有session可以在该表上增加排他锁,只要该表中有记录被增加了排他锁。3)锁的有效期

i)程序可以控制数据库锁的有效期;

ii)当数据库关闭后,数据库锁将被释放;

iii)根据数据库使用了事务的情况,表锁的有效期不同。如果数据没有使用事务(没有使用事务日志,也不使用commit work语句),显式对一个表lock,当执行unload table时,锁将被释放;

iv)当数据库使用了事务,事务结束时,将释放事务所有的锁。

4)不同粒度的锁

i)数据库级别的锁:数据库管理活动,比如imports和exports。例如:

DATABASE database_name EXCLUSIVE;

ii)表级别的锁:当整个表或表的大部分数据需要更新,加表级锁效率高。参考语句如下:创建排他锁实例:

LOCK TABLE tab1 IN EXCLUSIVE MODE;

创建共享锁实例:

LOCK TABLE tab2 IN SHARE MODE;

取消表上的锁实例:

UNLOCK TABLE tab1;

iii)页级锁:当按数据物理顺序进行访问和更新时,页级锁效率高。修改锁模似为页级锁的参考语句如下: ALTER TABLE tab1 LOCK MODE PAGE;

页级锁模式是数据库默认的表锁模式。

iv)行级锁:OLTP事务采用行级锁效率高。创建表时指定为行级锁的参考语句如下:

CREATE TABLE tab1 (col1) LOCK MODE ROW;

将某表修改为行级别的语句参考如下:

ALTER TABLE tab1 LOCK MODE (ROW);

5)何种情况下用何种锁?

i)如果更新表中相对较小一部分数据的时候,采用行级锁将获取最好的性能,如果一个事务只访问表

中的一小部分数据,那就采用行级锁。

ii)如果一个事务频繁访问整个表中的数据,设置更粗的力度,比如表级锁;

iii)如果更新数据库中大部分表的大部分数据的情况下,采用数据库级别的锁;

iv)informix默认的锁模式为页级锁。

v)ONCONFIG参数DEF_TABLE_LOCKMODE用于设置默认锁模式;

vi)查看表锁模式的方法如下:

方法1:

oncheck –pt dbname:tablename;

方法2:

相关文档
最新文档