http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.admin.dm.doc/doc/c0004583.html
导入实用程序支持两种表锁定方式:脱机或 ALLOW NO ACCESS 方式;以及联机或 ALLOW WRITE ACCESS 方式。
ALLOW NO ACCESS 方式会阻止并行应用程序访问表数据。ALLOW WRITE ACCESS 方式允许并行应用程序同时对导入目标表进行读写访问。如果未显式指定任何方式,那么导入会以缺省方式 ALLOW NO ACCESS 运行。同时,在缺省情况下,导入实用程序会使用隔离级别 RS(读稳定性)绑定至数据库。
脱机导入 (ALLOW NO ACCESS)
在
ALLOW NO ACCESS 方式下,导入会在插入任何行之前获取针对目标表的独占 (X) 锁定。挂起对该表的锁定有两种影响:
- 首先,如果其他应用程序挂起针对导入目标表的表锁定或行锁定,那么导入实用程序将等待这些应用程序落实或回滚更改。
- 其次,导入实用程序运行时,请求锁定的任何其他应用程序会等待导入操作完成。
注: 可指定锁定超时值,这会避免应用程序(包括导入实用程序)无限期等待锁定。
通过在操作开始时请求互斥锁定,导入可阻止因为其他应用程序正在处理并挂起针对同一目标表的行锁定而导致的死锁。
联机导入 (ALLOW WRITE ACCESS)
在
ALLOW WRITE ACCESS 方式下,导入实用程序将获取针对目标表的非独占 (IX) 锁定。挂起对该表的此锁定具有下列影响:
- 如果其他应用程序挂起不兼容的表锁定,那么在所有这些应用程序落实或回滚更改之前,导入实用程序不会开始插入数据。
- 导入实用程序运行时,如果任何其他应用程序请求不可兼容的表锁定,那么这些应用程序都将等待直至导入操作落实或回滚当前事务。注意,导入的表锁定仅对单个事务有效。因此,在每次落实后,联机导入必须请求表锁定并可能需要等待。
- 如果其他应用程序挂起不兼容的行锁定,那么导入实用程序将停止插入数据直到所有这些应用程序落实或回滚更改。
- 导入实用程序运行时,如果任何其他应用程序请求不可兼容的行锁定,那么这些应用程序都将等待直至导入操作落实或回滚当前事务。
为保留联机属性并降低死锁机率,ALLOW WRITE ACCESS 导入将定期落实当前事务,并在上升为独占表锁定之前释放所有行锁定。如果未显式设置落实频率,那么导入会按指定了 COMMITCOUNT AUTOMATIC 的方式落实。如果 COMMITCOUNT 设置为 0,那么不会执行任何落实。
ALLOW WRITE ACCESS 方式与下列各项不兼容:
- 以 REPLACE、CREATE 或 REPLACE_CREATE 方式导入
- 使用缓冲插入导入
- 导入到目标视图中
- 导入到层次结构表中
- 导入到锁定详细程度设置为表级别(通过使用 ALTER TABLE 语句的 LOCKSIZE 参数设置)的表中