返回首页

gbase数据、南大通用产品文档:GBase8sifx_lo_copy_to_lo() 函数

更新日期:2024年09月11日

ifx_lo_copy_to_lo() 函数将文件的内容复制至打开的智能大对象内。
语法
mint ifx_lo_copy_to_lo(LO_fd, fname, flags)
mint LO_fd;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 775 -

char *fname;
mint flags;
LO_fd
要向其中写入文件内容的打开的智能大对象的 LO 文件描述符。
fname
包含要复制的数据的源文件的完全路径名称。
flags
指定 fname 文件的位置的整数。



用法
ifx_lo_copy_to_lo() 函数可复制服务器或客户机计算机上的源文件的内容。flags
参数的标志值指示要复制的文件的位置。locator.h 头文件定义的有效的值包括下列常量。
File-location 常量用途
LO_CLIENT_FILE
fname 文件在客户机计算机上。
LO_SERVER_FILE
fname 文件在服务器计算机上。
LO_APPEND
将 fname 中的数据追加到指定的智能大对象的末尾。
可以前面的标志之一来屏蔽此标
志。
返回代码
0
函数成功。
<0
函数不成功,且返回值指示失败的原因。

使用 LOCK TABLE 语句来控制通过其他进程访问表。xzzz
语法

元素
描述
限制
语法
owner
synonym 或
table 的所有者
必须为指定的对象的所有者
所有者名称
synonym 要被锁定的表的
同义词
同义词以及指向它的表必须存在 标识符
table
要被锁定的表
请参阅 用法 的第一段。
标识符
用法
此语句是对 SQL 的 ANSI/ISO 标准的扩展。
如果下列任一为真,则您可使用 LOCK TABLE 来锁定表:

您是该表的所有者。

您有对该表或对该表中列的 Select 权限,或通过直接授权,或通过授权
给 PUBLIC 或给您的当前角色。
如果该表已被另一进程在 EXCLUSIVE 模式下锁定,或如果您请求 EXCLUSIVE
锁而另一用户已经以 SHARE 模式锁定了同一张表,则 LOCK TABLE 语句失
败。
SHARE 关键字以共享模式锁定表。共享模式允许其他进程对该表的读访问,但
拒绝写访问。如果以共享模式锁定表,则其他进程不可更新或删除数据。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 734
EXCLUSIVE 关键字以排他模式锁定表。此模式拒绝其他进程对表进行读访问,也
拒绝写访问。 在下列语句期间,排他模式锁定自动地发生:

ALTER FRAGMENT

ALTER INDEX

ALTER TABLE

CREATE INDEX

DROP INDEX

RENAME COLUMN

RENAME TABLE

START VIOLATIONS TABLE

STOP VIOLATIONS TABLE

TRUNCATE
在一些 DDL 操作中的 ONLINE 关键字
在某些 ALTER FRAGMENT、DROP INDEX 和 CREATE INDEX 操作期间,包
括 ONLINE 关键字在内,当并发的会话尝试访问同一表时,可减低运行时出错的
风险。要获取更多关于支持 ONLINE 关键字选项的那些 DDL 语句的锁定行为
的信息,请参阅这些主题:

在 ATTACH 操作中使用 ONLINE 关键字

在 DETACH 操作中使用 ONLINE 关键字

在 MODIFY 操作中使用 ONLINE 关键字

CREATE INDEX 的 ONLINE 关键字

DROP INDEX 的 ONLINE 关键字.
在辅助服务器上的 LOCK TABLE 语句行为
在高可用性集群中,您可从可更新的辅助服务器上设置表的排他锁。对于来自辅
助服务器的排他模式锁请求,会话可读该表但不可更新它。此行为类似于辅助服
务器上的共享访问模式;即,当一会话在给定的表上有排他锁时,其他会话不可
获取那个表上的共享或排他锁。
在只读的辅助服务器上,发出 LOCK TABLE 语句的会话不锁定该表,且数据库
服务器不向客户端返回错误。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 735
集群中的共享模式锁的行为与单独服务器的相同。在成功地运行 LOCK TABLE
语句之后,用户可读该表但不可改变它,直到释放该锁为止。
对带有共享锁的表的并发访问
在成功地执行指定 IN SHARE MODE 关键字的 LOCK TABLE 语句之后,其他
用户可读该表,但不可改变他的数据,直到释放该锁为止。在支持事务日志记录
的数据库中,SELECT 语句可在罗列在 FROM 子句中的每一表上隐式地放置一
共享锁,以便防止其他用户修改那些表,直到提交或回滚该查询为止。
对带有排他锁的表的并发访问
成功地执行带有 IN EXCLUSIVE MODE 选项的 LOCK TABLE 语句之后,其他
用户不可获得对该指定表的锁。然而,当您尝试对那个表进行 DDL 操作时,如
果一并发的会话(例如,通过打开游标)正在访问同一表,则您可能收到 RSAM
error -106。此错误还可影响某些 DDL 语句自动地在这些表上放置的隐式的锁。
这可能是因为表锁不排除表访问。排他锁防止其他用户获得锁,但不防止那些等
待释放该排他锁的写操作打开该表,或对该表的 Dirty Read 操作。您可设置
IFX_DIRTY_WAIT 环境变量来指定 DDL 等待指定的秒数,以便 Dirty Read 操
作提交或回滚。
当表中的一行或多行被排他锁锁定时,对其他用户的影响部分地取决于他们的事
务隔离级别。除了 Dirty Read 隔离级别之外的所有其他隔离级别中的其他用户可
能遇到锁定错误,比如,由于在指定的时间限制内未释放锁,或由于发生死锁情
况,导致事务失败。
在行级锁定影响一些行的表上,通过启用事务来在行级锁定的表中读取数据的最
近提交的版本,可降低锁定冲突的风险,而不是等待提交或回滚在那行上持有该
锁的事务。这可通过几种不同的方法实现,包括:

从单个事务发出此 SQL 语句
SET ISOLATION TO COMMITTED READ LAST COMMITTED;

对于使用 Committed Read 或 Read Committed 隔离级别的所有会话,请
将 USELASTCOMMITTED 配置参数设置为 'ALL' 或 'COMMITTED
READ',或者另发出带有 'ALL' 或 'COMMITTED READ' 作为会话环
境选项的 SET ENVIRONMENT USELASTCOMMITTED 语句。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 736

对于使用 Dirty Read 或 Read Uncommitted 隔离级别的所有会话,请将
USELASTCOMMITTED 配置参数设置为 'ALL' 或 'DIRTY READ',
或者另发出带有 'ALL' 或 'DIRTY READ' 作为会话环境选项的 SET
ENVIRONMENT USELASTCOMMITTED 语句。

对于在数据库中为其定义 user.sysdbopen( ) 过程的用户,DBA 可定义那
个过程来包括 SET ENVIRONMENT USELASTCOMMITTED 语句,此语
句带有 'ALL' 或 'COMMITTED READ' 作为会话环境选项,且还发出
SET ISOLATION 语句来设置 Committed Read 作为隔离级别。

对于在数据库中不存在为其定义 user.sysdbopen( ) 过程的用户,DBA 可
定义 PUBLIC.sysdbopen 过程,该过程指定相同的 SET
ENVIRONMENT USELASTCOMMITTED 和 SET ISOLATION 语句。
仅当行级锁定有效时,而不是当另一会话持有对整个表的排他锁时,此 LAST
COMMITTED 隔离特性才有用。当 LOCK TABLE 应用表级锁时,此特性对于指
定的表不可用。要了解更多关于此 LAST COMMITTED 特性,为了并发访问有
些行被排他锁锁定的表,且为了在可支持此特性的表的种类上的限制的信息,请
参阅 Committed Read 的 LAST COMMITTED 选项。
带有事务日志记录的数据库
如果您以事务日志记录创建的数据库,则 LOCK TABLE 语句成功,仅当在事务
之内执行它。在您可执行 LOCK TABLE 语句之前,必须发出 BEGIN WORK 语
句。
在符合 ANSI 的数据库中,事务是隐式的。如果指定的表尚未被另一进程锁定,
则 LOCK TABLE 语句成功。
下列准则适用于在事务内使用 LOCK TABLE 语句:

您不可锁定系统目录表。

您不可在事务内在共享的和排他的表锁之间切换。例如,一旦您在共享模
式下锁定该表,不可将该锁定模式升级为排他。

如果在访问表中的一行之前,您发出 LOCK TABLE 语句,且 PDQ 为
生效,则不为该表设置行锁。以此方式,您可覆盖行级锁定并避免超过在
数据库服务器配置中定义的锁定的最大数目。(但如果 PDQ 生效,则您
可能用尽锁,发生错误 -134,除非您的 ONCONFIG 文件的 LOCKS 参
数指定足够大的锁定数。)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 737

在完成事务之后,自动地释放所有行和表锁。 在使用事务日志记录的数
据库中,UNLOCK TABLE 语句失败。

同一用户可显式地使用 LOCK TABLE 来并发地锁定最多 32 个表。
(使用 SET ISOLATION 来指定适当的隔离级别,诸如 Repeatable
Read,如果在单个事务期间您需要从多于 32 个表锁定行的话。)
下列示例展示如何在以事务日志记录创建了的数据库中更改表的锁定模式:
BEGIN WORK;
LOCK TABLE orders IN EXCLUSIVE MODE;
...
COMMIT WORK;
BEGIN WORK;
LOCK TABLE orders IN SHARE MODE;
...
COMMIT WORK;
警告: 建议您在事务中不要使用无日志记录的表。如果您需要在事务中使用无日
志记录的表,或在排他模式下锁定该表,或设置隔离级别为 Repeatable Read,以
防并发问题。
无事务日志记录的数据库
在无事务日志记录(通过省略 CREATE DATABASE 语句中的 WITH LOG 关键
字)创建了的数据库中,在任一下列事件之后,释放通过 LOCK TABLE 语句设
定了的表锁:

执行 UNLOCK TABLE 语句。

用户关闭该数据库。

用户从应用程序退出。
要更改对表的锁定模式,请以 UNLOCK TABLE 语句释放该锁,然后发出新的
LOCK TABLE 语句。
下列示例展示如何在无日志记录的表中更改锁定模式:
LOCK TABLE orders IN EXCLUSIVE MODE;
. . .
UNLOCK TABLE orders;
. . .
LOCK TABLE orders IN SHARE MODE;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 738
锁定粒度
锁定表的缺省的粒度是在页级,或者您在 IFX_TABLE_LOCKMODE 环境变量
中指定的任何级别(或 PAGE 或 ROW),若未设定,则通过 ONCONFIG 文件
中的 DEF_TABLE_LOCKMODE 设置。CREATE TABLE 或 ALTER TABLE 语
句的 LOCK MODE 子句可通过指定 PAGE 或 ROW 覆盖缺省的锁定粒度。仅
行级锁支持 GBase 8s 的 LAST COMMITTED 特性。
然而,LOCK TABLE 语句通常锁定整个表,覆盖对该表的所有其他锁定粒度规
范。
在所有这些上下文中,数据“锁模式”都表示锁定粒度。然而,在 SET LOCK
MODE 语句的上下文中,“锁模式”指的是当进程尝试访问另一进程已经锁定的行
或表时,数据库服务器的行为。

功能
这个参数用于控制,当存在ORDER BY 或LIMIT 的情况下,是否对GROUP BY
做动态重分布操作。
参数取值含义说明

参数= 0:关闭;

GBase 8a MPP Cluster 产品手册
6 附录
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1552

参数= 1:开启。
该参数的默认值是0。
表6- 24 参数值范围说明表
默认值
最小值
最大值
0
0
1
使用场景

关闭此参数的场景:
汇总GROUP BY 的代价较小,关闭此参数,以避免为ORDER BY 和LIMIT
产生额外的汇总步骤。

开启此参数的场景:
当分布式执行GROUP BY 性能明显优于汇总执行GROUP BY 时,开启此参
数,以提升查询性能。