分类: DB2/Informix
2008-05-31 16:47:29
并发
并发对于多程序系统中的性能非常重要。如果数据访问被序列化,那么每次只有一个程序可以使用相关数据,处理就会显著变慢。让多个应用程序同时访问数据库,效率就会高得多。
在当前连接上有活动事务的情况下,WITH CONCURRENT TRANSACTION
子句可以切换到另一个连接。如果当前连接不是使用 WITH CONCURRENT TRANSACTION
子句建立的,那么在有活动事务的情况下,就不能切换到另一个连接;CONNECT
或 SET CONNECTION
语句失败,返回一个错误,当前连接中的事务仍然是活动的。
在这种情况下,应用程序必须提交或回滚当前连接中的活动事务,然后才能切换到另一个连接。
WITH CONCURRENT TRANSACTION
支持多个并发事务,在这种情况下,每个连接可以有自己的事务,而且 COMMIT WORK
和 ROLLBACK WORK
语句只影响当前连接。WITH CONCURRENT TRANSACTION
子句不支持全局事务,也就是一个事务跨多个数据库连接。COMMIT WORK
和 ROLLBACK WORK
语句不能跨多个数据库连接。
|
如果数据库位于一个单用户工作站上,没有到其他计算机的网络连接,并发就不重要了。在其他所有情况下,在您的程序修改数据时,都必须尽可能允许其他程序读取或修改相同的数据。并发涉及两个或更多的程序独立地同时使用相同的数据。
高度并发性对于多用户数据库系统中的性能非常重要。但是,除非对数据的使用方式进行控制,否则并发可能会导致各种负面作用。程序可能会读取过时的数据;即使看上去成果输入了修改,它们仍然可能会丢失。
为了防止这类错误,数据库服务器使用一个锁系统。锁是程序可以在一组数据上放置的一种声明或预订。数据库服务器保证,只要数据被锁定了,其他程序就不能修改它。当另一个程序请求此数据时,数据库服务器要么让这个程序等待,要么返回给它一个错误。
为了控制锁对数据访问的影响,可以使用 SQL 语句的组合:SET LOCK MODE
和 SET ISOLATION 或 SET TRANSACTION
。
在使用 committed read 隔离级别时,如果其他会话持有锁,当前会话无法获得锁,或者数据库服务器探测到了死锁,SQL 操作就会失败。(如果两个用户都持有锁,而每个用户希望获得对方拥有的锁,就会出现死锁。)SET ISOLATION COMMITTED READ
语句的 LAST COMMITTED
关键字选项可以减少锁冲突的风险。这个语法要求服务器返回最近提交的行版本,即使另一个并发会话持有排他锁。对于 B-tree 和功能性索引、支持事务日志记录的表以及不采用页面级锁或排他锁的表,可以使用 LAST COMMITTED
关键字选项。
USELASTCOMMITTED
指定,COMMITTED READ
隔离级别的 LAST COMMITTED
特性隐式地生效。
值的范围:
对这个 onconfig
参数的修改只在共享内存重新初始化时生效。
当数据库服务器处于在线模式时,可以使用 onmode -wm
和 onmode -wf
选项修改 USELASTCOMMITTED
配置参数的值。
使用以下语法为当前会话的任意一个配置参数指定新值:
onmode -wm USELASTCOMMITTED=value
使用以下语法修改 ONCONFIG 文件中任意一个配置参数:
onmode -wf USELASTCOMMITTED=value
SET ENVIRONMENT
SQL 语句可以在运行时指定选项,它所做的设置会影响同一例程中提交的后续查询。这是对 SQL 的 ANSI/ISO 标准的扩展。
USELASTCOMMITTED
的设置与 onconfig 参数相同: