【问题标题】:Synchronized access to database?同步访问数据库?
【发布时间】:2011-11-23 16:27:55
【问题描述】:

我正在为我叔叔的钓鱼店写一个小商店管理软件。它支持多个客户端访问本地网络中的单个数据库。我目前正在寻找一种方法来同步对数据库的访问。一种解决方案是编写一个管理数据库访问的服务器程序。但是我没有网络编程经验,所以我想找到其他解决方案。我想出了以下几点:

数据库中的每个条目都有一个时间戳,用于告知它最后一次被编辑的时间。在客户端编辑条目之前,它会读取时间戳以检查该条目是否已被另一个客户端修改。如果是这种情况,客户端不会写入数据库,而是通知用户。用户必须将他的本地更改与修改后的数据库条目合并。读取时间戳、检查时间戳和写入数据库的过程将实现为单个 jdbc 事务。

你觉得怎么样,这行得通吗?

【问题讨论】:

  • 是的,我已经看到它被使用过(即使在一个特定系统中,所有事情都是通过数据库过程完成的,这对原子性有很大帮助)。另一种解决方案是在编辑对象之前锁定对象(因此您将拥有“locked_by”而不是“last_modified”列)。只有通过锁定检查机制才允许对对象进行写访问。但是,这种设计需要某种超时策略才能起作用。

标签: java database jdbc transactions synchronisation


【解决方案1】:

对于您的应用程序,由于它似乎很小(客户端数量合理,并发性低,...),您应该使用事务感知数据库(和引擎,如 MySQL 的 InnoDB,虽然这只是一个示例) ,并在 SERIALIZABLE 事务隔离中运行。从那时起,您可以保证没有两个人可以在不知情的情况下更新相同的内容,您只需遵循最佳实践即可。

使用时间戳就是通常所说的“乐观”锁定。基本上阅读,并尝试编写预期的东西不会改变(包括 WHERE 子句中的时间戳或版本号),这通常是一件好事(至少对于您的规模的应用程序,具有大量客户端的应用程序) ,高并发在某些情况下会受到影响)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2012-11-11
    • 2010-09-16
    • 2019-11-15
    相关资源
    最近更新 更多