数据库加锁是一个必要的措施和核心的DBMS组件。加锁保持了数据一致性,防止多个会话同时改变相同的数据。但是使用和维护数据库锁会非常的麻烦,特别是对复杂系统和程序以及会话来说。
乐观锁机制目前使用了定义在DB2表中的新特性来减少死锁的发生和总体的加锁负载,提高了系统和应用程序的性能。乐观锁机制可以参考这里http://DB2mag.com/story/showArticle.jhtml?articleID=201201095
为了使用新的乐观锁机制,你需要定义一个新的ROW CHANGE TIMESTAMP列在DB2表中,并使用新参数(GENERATED ALWAYS, FOR EACH ROW ON UPDATE, AS ROW CHANGE TIMESTAMP)
如下:
CREATE TABLE BEULKE.PRODUCT_TBL (
PROD_NBR INTEGER NOT NULL,
PROD_INVENTORY INTEGER NOT NULL,
PROD_LAST_UPD NOT NULL
GENERATED ALWAYS
FOR EACH ROW ON UPDATE
AS ROW CHANGE
TIMESTAMP);
这些参数告诉DB2总是特别注意时戳和表。最新更新的时戳已经在程序里植入很多年了,IBM已经开始更新这项技术。
这些新特性使得DB2可以从一个特定的时间段获取行,并且理解它们在何时被修改。DB2不仅标注上了行时戳信息,还有记录ID(RID)和改变标记信息。标注行属性允许程序和用户来通过时戳查找数据库,以基于Where时戳语句获取一个特定行或者行的组。
新的列特性通过允许多个程序重新绑定减少了加锁开销,减少了加锁的诸多配置如Repeatable Read (RR), Read Stability (RS), or Cursor Stability (CS) to Uncommitted Read (UR)。不受拘束的读避免了数据库锁;应用程序通过在程序的UPDATE SQL语句中使用新的时戳列可以保持数据库会话一致性。新的时戳列提供了时戳和行的记录ID(RID),DB2可以用来验证是否其他程序改变了有问题的数据。
另外一个DB2 9 SQL语句,SKIP LOCKED DATA,也通过使用不兼容的锁来不获取或者不影响数据行以帮助减少锁。你可以在SELECT, UPDATE和DELETE SQL语句中使用该语句来避免死锁。
使用隔离层次的UR和SKIP LOCKED DATA语句需要谨慎。尽管这项技术能够极大的减少加锁并且提高性能,它们却需要你非常了解自己的程序。在性能提升前,请仔细了解你的每个程序,并且阅读DB2的手册。