我正在编写一个使用FireDac组件访问多用户数据库的程序。
我有一个表“客户”,我存储了一些客户数据。
用户应始终查看存储在数据库中的当前实际数据。
问题:
想象一下,有2个用户(用户A和用户B)记录了它。 所以我的应用程序在2台不同的PC上打开了2次。
两者同时登录并查看相同的数据记录。
用户A决定将第一个客户名称从“John Doe”编辑为“Tom Smith”并将其保存(.Post
)到数据库。
新名称现在正确存储在数据库中。
用户B仍然在查看客户#1并且没有看到所做的更改(这很好,因为他在更改后没有浏览或刷新此数据记录)。 但是,如果用户B浏览客户#2然后回到#1,他仍然会看到旧数据(“John Doe”而不是“Tom Smith”)。
-
因此,如果用户浏览数据集,他会从查询中获取数据值。
-
当前解决方案:
每次数据集“显示”不同记录时,都会触发“AfterScroll”/“BeforeScroll”事件。
所以我所做的是在这些事件中调用FDQuery1.Refresh以确保显示实际数据。
-
修改上述事件是解决我问题的“正确”方法,还是有更好的方法来实现我的目标?
我希望你理解我的问题并感谢你的阅读。
答案 0 :(得分:2)
您可以使用单独的通知机制向所有感兴趣的客户广播诸如“新订单到达”,“客户记录修改”等事件。
某些数据库包含对此技术的内置支持(例如Firebird events)。它避免了频繁的数据重新加载,因此可以最大限度地减少网络流量并提高应用程序响应能力。
另请参阅:Database Alerts (FireDAC)
DBMS警报是指由a发送的数据库通知或警报 数据库触发器或存储过程,目的是通知a 数据库客户端关于数据库端的一些事件。
但您不仅限于这些FireDac特定警报。您可以在客户端之间使用许多其他方式和协议(如套接字,HTTP,MQTT,STOMP等)构建自己的,与数据库无关的通知系统。