gpt4 book ai didi

delphi - 当多个用户正在编辑它时,TDBGrid 不会更新

转载 作者:行者123 更新时间:2023-12-03 19:42:41 27 4
gpt4 key购买 nike

我正在开发一个具有简单数据库的应用程序。所有功能都运行良好,但是当用户从程序中编辑数据库时,其他用户无法立即看到内容。其他用户需要关闭程序并重新打开它才能显示数据及其DBGrid。使用其他计算机上的这些更改进行更新。为此,我使用 Delphi 7 和 ZeosLib 来访问我的 Firebird 数据库。我尝试使用 DBNavigator 上的刷新按钮,但它不起作用。

我用来连接数据库的组件是:

  • 中联
  • 查询
  • 数据源
  • 数据库网格
  • DBNavigator

  • 这是我的 ZConnection 和 ZQuery 的代码。
    object ZConnection1: TZConnection
    ControlsCodePage = cGET_ACP
    UTF8StringsAsWideField = False
    Connected = True
    Port = 3051
    Database = '192.168.254.254:test'
    User = 'test'
    Password = 'test'
    Protocol = 'firebird-2.5'
    Left = 96
    Top = 8
    end
    object ZQuery1: TZQuery
    Connection = ZConnection1
    Active = True
    SQL.Strings = (
    'select * from "test"')
    Params = <>
    Left = 128
    Top = 8
    object ZQuery1ID: TStringField
    FieldName = 'ID'
    Required = True
    Size = 8
    end

    最佳答案

    听起来你正在与 ACID 发生冲突.这是 SQL 风格数据库的基本保证,所有数据库更新都是原子的、一致的、隔离的和持久的,并且通过事务完成。

    具体来说,您在一致性和隔离方面遇到了问题,这确保外部查看者在更新完成之前永远不会看到更新,即使该更新包含多个更改。 (典型的例子是银行转账,需要从一个账户中减去钱,然后将其添加到另一个账户中。如果您只看到这两个操作之一,而没有看到另一个,则您的数据不正确。)

    您可以将事务视为数据库状态的独立 View 。每个数据库连接都有自己的事务,并且它所做的任何更改对其他任何人(隔离)都是不可见的,直到他们提交(最终确定)事务。根据事务的隔离设置,即使在此之后,如果他们有正在进行的事务,它们可能对其他用户仍然不可见,直到他们提交事务并开始新的事务。听起来您的代码没有考虑到这一点。

    如果您需要立即看到更新,您需要确保 transaction's isolation modeREAD COMMITTED , 和 set up database events当各种事情更新时向连接的客户端发送通知,以便客户端可以执行其数据的刷新。您还需要确保用户更新立即导致提交操作,以便隔离数据可用。

    由于我不使用 ZeosLib,我无法解释您需要如何设置这一切的所有细节,但这足以让您走上正轨。

    关于delphi - 当多个用户正在编辑它时,TDBGrid 不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16323993/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com