在GBase南大通用数据库中,保持游标的规则

2024-01-23 19:04

本文主要是介绍在GBase南大通用数据库中,保持游标的规则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当使用事务日志记录时,GBase 8s 保证在事务结束时,可回滚在事务内所作的一切。要可 靠地处理事务,数据库服务器通常应用下列规则:

• 当事务结束时,关闭所有游标。

• 当事务结束时,释放所有锁。

对于支持事务的大多数数据库系统,用于可靠地处理事务的规则都是正常的。然而,存在 一些情况,随同游标使用标准事务是不可能的。例如,在没有事务的情况下,下列代码正 常工作。然而,当添加事务时,关闭游标与同时使用两个游标发生冲突。 

  EXEC SQL DECLARE master CURSOR FOR

 EXEC SQL DECLARE detail CURSOR FOR FOR UPDATE 

 EXEC SQL OPEN master;

 while(SQLCODE == 0)

 {

 EXEC SQL FETCH master INTO 

 if(SQLCODE == 0)

 { 

 EXEC SQL BEGIN WORK;

 EXEC SQL OPEN detail USING 

 EXEC SQL FETCH detail

 EXEC SQL UPDATE WHERE CURRENT OF detail

 EXEC SQL COMMIT WORK; 

 }

 }

 EXEC SQL CLOSE master; 

在此设计中,使用一个游标来扫描表。选择了的记录用作更新不同的表的基础。问题在于, 当将每一更新当做分开的事务处理时(如前一示例中伪代码所示),跟在 UPDATE 之后 的 COMMIT WORK 语句关闭所有游标,包括主游标。

最简单的替代方案是将 COMMIT WORK 语句和 BEGIN WORK 语句分别移到最后一个 语句和第一个语句, 这样,对整个主表的扫描就是一个大事务。将主表的扫描作为一个大 事务来处理,有时是可能的,但如果需要更新许多行,它可变得不现实。锁的数目可能太 大,并且在程序期间持有它们。 

 GBase 8s 数据库服务器支持的解决方案是将关键字 WITH HOLD 添加到主游标的声明。引 用这样的游标作为持有游标,在不在事务结束时关闭。数据库服务器仍然关闭所有其他游 标,且它仍然释放所有锁,但持有游标保持打开,直到显式地关闭它为止。 

在您尝试使用持有游标之前,您必须确保了解此处描述的锁定机制,且您还必须了解正在 并发地运行的程序。每当执行 COMMIT WORK 时,释放所有锁,包括放置在任何通过该 持有游标访存的行上的任何锁。 

对于对表的单向扫描,如果如您所愿地使用游标,则锁的移除无关紧要。然而,您可为任 何游标指定 WITH HOLD,包括更新游标和滚动游标。在您这么做之前,您必须了解该事 实的含义,即,在事务结束时,释放所有锁(包括对整个表的锁)。

这篇关于在GBase南大通用数据库中,保持游标的规则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/637227

相关文章

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发