1、什么是事务?
事务是指作为单个逻辑工作单元执行的一系列操作。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。数据库服务器保证在事务范围内执行的操作完整且正确地提交至磁盘,否则数据库会复原至事务启动之前的状态。
一个逻辑工作单元要成为事务,必须满足所谓的ACID属性。ACID的具体含义如下:
1)A(Atomicity):操作序列要么完整的执行,否则什么都不做;
2)C(Consistency):一致性,事务执行后,保证数据库从一个一致性状态到另外一个一致性状态;
3)I(Isolation):隔离,一个事务的中间状态对其他事务不可见,即每个用户都感觉他们在单独使用数据库。隔离级别用来定义多大程度的隔离多个不同的事务;
4)D(Durability):持久性,事务的有效性,不会应用硬件或软件的失败而丢失
2、GBase 8s锁介绍
锁是一种软件机制,用于控制对数据库中数据的访问。在出现同时读取和更新数据的多用户环境中,锁能够确保每个事务的原子性、隔离、一致性和持续性(ACID)不受到威胁,并且维护数据的完整性。
锁的粒度越粗,它就能锁住越多的数据库对象。例如,对于能够在一个磁盘页上包含4 行的表,在该页放置一个锁,将锁住其中包含的所有 4 个行。相反,如果使用行锁,那么将仅锁住一个行。因此,锁的粒度越粗,并发性就越低,从而影响到性能,尤其在应用程序试图访问相同的行集时。不过,粗粒度也意味着在某些情况下锁住相同数量的行需要的锁数量更少。例如,锁住整个表仅需要一个表锁。
-
锁粒度
GBase 8s 优越于其他数据库,提供6种粒度的锁。
数据库锁:针对整个数据库的锁
表锁:针对整个表的锁
页锁:针对整页数据的锁
行锁:针对一个数据行的锁
字节锁:在包含 VARCHAR 的行上的锁
键锁:在索引中的一个键值上的锁 -
锁的类型
数据库、表、页和行(在这个小节中统称为对象)通过不同类型的锁来控制对自身的访问。
1)共享锁(Shared locks):多个用户可以读取相同的记录
如果一个对象上没有排他锁,则共享锁可以加在该对象上,它可以防止其他事务更新数据,但同时,其他事务可以读取该数据,多个事务可以在同一个对象上加多个共享锁。
2)排他锁(Exclusive locks):同一时间仅仅有一个用户可以读取相同的记录
如果一个对象上没有任何锁,排他锁才可以加在该对象上。一旦在记录上加了排他锁,则不能在该记录上增加任何锁了,直至锁释放。它可以防止其他事务读取和更新数据。
3)提升/更新锁(Promotable/Update lock):可以对锁进行升级或者降级
在更新游标时使用,由游标在含有“for update”选项执行时产生,只能在没有排他锁或其他更新锁的记录上加更新锁。当锁定的记录真正执行的时候,更新锁将提升为排他锁。
4)专一锁(Intent lock):是一种表级锁,标识在该表上有一个游标在读取数据
由IDS自动分配,如果一条记录上的记录被更新,一个排他锁将分配在该记录上,同时将该记录的表上自动加上专一锁,这能保证没有session可以在该表上增加排他锁,只要该表中有记录被增加了排他锁。 -
隔离级别
GBase 8s提供以下五个级别的并发性,通过set isolation SQL命令设置。
1)Dirty Read隔离级别:这个并发性级别不锁定任何行,并且读取其他用户锁定或正在更改的行。它能够返回可能回滚的未提交数据。对于数据仓库环境或获取数据比读取已提交记录更重要的环境,这个并发性级别非常有用。
2)Committed Read隔离级别:这个级别不锁定任何行,但如果有人执行更新或在行上使用排他锁,它将失败。它仅读取已提交的行。行在读取之后可能还会变更,但它不能有可以被读取的锁。这个级别是使用日志的数据库的默认设置,并且大部分 OLTP都采用该级别。不过,当一个用户请求被另一个用户锁定的行时,您必须提供错误处理。
3)Cursor Stability隔离级别:这个级别在选择的行上放置一个共享锁,因此当有用户正在读取某行时,其他用户就不能更新它。当获取到另一个行或关闭指针时,这个锁将被释放。
4)Repeatable Read隔离级别:这个级别创建最大数量的锁,因为它为每个读取的行或用户扫描的行放置一个共享锁,以使这些行不能再被更改,重复读取将返回同样的记录和值。在事务提交或回滚之后,就释放这些锁。这个级别是ANSI模式的数据库的默认设置。
5)Last Committed Read隔离级别:其工作方式与Committed Read非常相似;不过,当锁定以更新某个行时,IDS 将从日志中读取最近提交的记录。只有使用行级锁创建表时这个级别才有效,但它能够大大减少锁错误,并返回最近的有效数据。




