2017-05-03 76 views
0

我做了一个数据库系统就在这里:同时访问数据库;保持数据一致在所有连接

(在规范化的意见是高度赞赏,以及 - 我中有你会恨我什么我tblIsolateSensitivity做了的感觉;只有tblHAIFile有一堆布尔字段和外键)。

比方说,我们有x个终端访问数据库。 X1编辑患者01,X2编辑患者02,X3同时删除患者01。我如何确保三个终端之间的数据都是最新且一致的?

此刻,我只在查询需要完成时才查询数据(即:当用户搜索记录时,或者如果程序需要根据数据库记录验证某些内容),这意味着数据仅与用户最近的查询一样更新。这使得很难确保所有终端上的数据都是最新的。当然,对于删除的条目,我有错误处理来处理,但其余的,以及...

所以,我的问题是:你们通常如何处理这种情况?是否有这个概念的名称,以便我可以查找并阅读很长时间?

回答

2

从数据库设计的角度来看,你应该乐观并发悲观并发阅读起来。这两个选项可以确保您没有两个用户同时修改相同的记录,或者至少如果您允许,可以检测到冲突以便解决冲突。

乐观并发背后的基本思想是允许多个用户同时查看和修改数据,假设这将是比较罕见的。但是,在任何用户写入数据更改之前,都会进行检查以确保基础数据自最初读取以来未发生更改。在某些情况下,您可以使用update之前的read手动执行此操作,并根据缓存的值检查每个列的值。但是,这很麻烦。某些DBMS系统具有使这更简单的功能。例如,SQL Server具有ROWVERSION(前身为TIMESTAMP)数据类型,它可以让别人是否因为你读它最后一次变更记录您检查容易使用单个值。

背后悲观并发的基本想法是,你在你要改变它期望把锁的记录。当您持有锁时,DBMS将阻止其他人获得自己的锁。

乐观并发的优势在于它重量轻,不会对应用程序造成太大干扰,让我们在极少数情况下手动(或自动)解决冲突。你也不必担心有人读过一个记录,锁定它,然后回家过周末。

悲观并发的好处是,它可以防止碰撞,但它可以从工作停止一个用户,而他们等待另一个完成他们在做什么。

从当记录的背景改变(即它们是由另一个用户改变)通知用户的角度来看这不是一个数据库设计功能。它可能是应用程序逻辑或应用程序数据访问层的一个功能。

+0

谢谢你这么多详细的说明!我不得不承认,我正在考虑对数据库上的记录进行悲观并发(不仅仅是因为我通常是pess-我的意思是现实主义者)。我认为可能发生的问题是,如果应用程序/数据库连接崩溃并且记录被锁定,直到DBA解锁所述记录。 –

+0

@RemiDarren你的评论的最后一句话是没有问题的。任何严重的数据库系统(如Postgres,MS SQL Server,Oracle等)都会自动释放任何正常关闭或悲剧失败的连接所持有的锁。同样,由该关闭/失败连接进行的任何事务都将回滚。这些是数据库服务器的一些基本职责。 –

+0

@RemiDarren请参阅:[悲观锁定和客户死亡](https://dba.stackexchange.com/q/37225/19079) –