首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于客户端连接数据库的方式在“过程锁定”方面的差异

基于客户端连接数据库的方式在“过程锁定”方面的差异
EN

Stack Overflow用户
提问于 2022-09-07 16:28:59
回答 2查看 49关注 0票数 1

我创建了一个这样的测试过程:

代码语言:javascript
复制
CREATE OR ALTER PROCEDURE tmp_fab
RETURNS (dummy INTEGER) AS
BEGIN
    dummy = 1;
    suspend;
END

然后,第一个客户机(“客户端A")通过执行以下SQL来使用该过程:

代码语言:javascript
复制
SELECT *
FROM tmp_fab

如果另一个客户端(“客户端B")试图更改过程(而”客户端A“事务仍然处于活动状态,没有提交/回滚),我将看到基于”客户端B“连接到数据库的方式的不同行为。

例如,

试图按以下方式修改程序:

代码语言:javascript
复制
CREATE OR ALTER PROCEDURE tmp_fab
RETURNS (dummy INTEGER) AS
BEGIN
    dummy = 2;
    suspend;
END

在提交“客户B”交易时..。

失败,但有以下错误:

代码语言:javascript
复制
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Lock conflict on no wait transaction.
Unsuccessful metadata update.
Object PROCEDURE "TMP_FAB" is in use.

  • 使用FireDAC Delphi组件(DriverName =FB)
  • 使用FIBPlus Delphi
  • IBExpert (它使用自己的firebird的dll)

它成功了,正确地改变了程序.

  • 使用isql
  • 使用DBeaver (它使用JDBC)
  • 使用FireDAC Delphi组件(DriverName = ODBC)

这两种不同行为的原因是什么?(也许是一些事务设置?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-07 21:44:51

是的,这是事务设置的问题。准确地说,错误消息中提到的“不等待”选项。此选项不在默认集合中,因此命名的客户端应用程序/组件必须显式地设置它。

通常,当遇到锁定的元数据对象时,“等待”事务会向其他事务/连接/服务器实例发送信号,以检查它们是否仍然活着,并礼貌地请求释放锁。然后它自然地等待锁被释放。“不等待”事务不会立即返回错误。

票数 2
EN

Stack Overflow用户

发布于 2022-09-07 20:16:41

在Firebird中没有元数据(如存储过程)的版本控制。因此,另一个连接正在使用的更新过程是有风险的操作,结果无法预测。作为经验法则,安排一些维护时间,并且只在垄断连接范围内改变数据库结构。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73638885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档