Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103179847
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-05-31 16:47:29

并发

并发对于多程序系统中的性能非常重要。如果数据访问被序列化,那么每次只有一个程序可以使用相关数据,处理就会显著变慢。让多个应用程序同时访问数据库,效率就会高得多。

在当前连接上有活动事务的情况下,WITH CONCURRENT TRANSACTION 子句可以切换到另一个连接。如果当前连接不是使用 WITH CONCURRENT TRANSACTION 子句建立的,那么在有活动事务的情况下,就不能切换到另一个连接;CONNECTSET CONNECTION 语句失败,返回一个错误,当前连接中的事务仍然是活动的。

在这种情况下,应用程序必须提交或回滚当前连接中的活动事务,然后才能切换到另一个连接。

WITH CONCURRENT TRANSACTION 支持多个并发事务,在这种情况下,每个连接可以有自己的事务,而且 COMMIT WORKROLLBACK WORK 语句只影响当前连接。WITH CONCURRENT TRANSACTION 子句不支持全局事务,也就是一个事务跨多个数据库连接。COMMIT WORKROLLBACK WORK 语句不能跨多个数据库连接。





回页首


如果数据库位于一个单用户工作站上,没有到其他计算机的网络连接,并发就不重要了。在其他所有情况下,在您的程序修改数据时,都必须尽可能允许其他程序读取或修改相同的数据。并发涉及两个或更多的程序独立地同时使用相同的数据。

高度并发性对于多用户数据库系统中的性能非常重要。但是,除非对数据的使用方式进行控制,否则并发可能会导致各种负面作用。程序可能会读取过时的数据;即使看上去成果输入了修改,它们仍然可能会丢失。

为了防止这类错误,数据库服务器使用一个锁系统。锁是程序可以在一组数据上放置的一种声明或预订。数据库服务器保证,只要数据被锁定了,其他程序就不能修改它。当另一个程序请求此数据时,数据库服务器要么让这个程序等待,要么返回给它一个错误。

为了控制锁对数据访问的影响,可以使用 SQL 语句的组合:SET LOCK MODESET ISOLATION 或 SET TRANSACTION

在使用 committed read 隔离级别时,如果其他会话持有锁,当前会话无法获得锁,或者数据库服务器探测到了死锁,SQL 操作就会失败。(如果两个用户都持有锁,而每个用户希望获得对方拥有的锁,就会出现死锁。)SET ISOLATION COMMITTED READ 语句的 LAST COMMITTED 关键字选项可以减少锁冲突的风险。这个语法要求服务器返回最近提交的行版本,即使另一个并发会话持有排他锁。对于 B-tree 和功能性索引、支持事务日志记录的表以及不采用页面级锁或排他锁的表,可以使用 LAST COMMITTED 关键字选项。

USELASTCOMMITTED 指定,COMMITTED READ 隔离级别的 LAST COMMITTED 特性隐式地生效。

值的范围:

  • None —— 不识别隔离级别
  • 'Committed Read' —— 处于 committed read 隔离级别的所有事务
  • 'Dirty Read' —— 处于 dirty read 隔离级别的所有事务
  • All —— 处于 committed read 和 dirty read 隔离级别的所有事务

对这个 onconfig 参数的修改只在共享内存重新初始化时生效。

当数据库服务器处于在线模式时,可以使用 onmode -wmonmode -wf 选项修改 USELASTCOMMITTED 配置参数的值。

使用以下语法为当前会话的任意一个配置参数指定新值:

onmode -wm USELASTCOMMITTED=value

使用以下语法修改 ONCONFIG 文件中任意一个配置参数:

onmode -wf USELASTCOMMITTED=value

SET ENVIRONMENT SQL 语句可以在运行时指定选项,它所做的设置会影响同一例程中提交的后续查询。这是对 SQL 的 ANSI/ISO 标准的扩展。

USELASTCOMMITTED 的设置与 onconfig 参数相同:

  • None —— 不识别隔离级别
  • 'Committed Read' —— 处于 committed read 隔离级别的所有事务
  • 'Dirty Read' 处于 dirty read 隔离级别的所有事务
  • All —— 处于 committed read 和 dirty read 隔离级别的所有事务
阅读(778) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~