数据库是否为多个客户端的事务提供PRAM一致性( http://en.wikipedia.org/wiki/PRAM_consistency )。
示例:假设我们有两个表X和Y,每个表都有一条记录和一条类型为int的列值,最初设置为0。
两个客户端连接到数据库。客户端1可以
BEGIN TRAN
UPDATE X SET Value = 1
COMMIT
BEGIN TRAN
UPDATE Y SET Value = 1
COMMIT客户端2做了
SELECT TOP 1 Value FROM Y // statement 1
SELECT TOP 1 Value FROM X // statement 2让我们假设,语句1从表Y中产生值1。RDBMS (假设MS SQL Server)是否保证在该条件下,语句2总是从表X中产生1?
换句话说,其他客户端是否总是会看到某些客户端提交事务的顺序与该客户端提交事务的顺序相同?
更一般的问题:如果RDBMSes不是PRAM,那么它到底保证了哪种类型的一致性?
发布于 2014-05-16 06:29:53
Do数据库为多个客户端的事务提供PRAM一致性( http://en.wikipedia.org/wiki/PRAM_consistency )。
有点。直接一致性模型似乎是atomic。(但请参见下文。)SQL数据库不仅关注RAM中发生的事情,还涉及更广泛的问题。
如果不是PRAM,那么RDBMSes到底保证了什么类型的一致性?
ACID:原子的、一致的、隔离的和持久的。
在这里一致并不意味着在并发模型中一致意味着相同的事情。在这里,一致意味着事务将数据库从一种有效状态更改为另一种有效状态。成功或失败的事务都不会使数据库处于无效状态。
例如,如果您有一个约束,要求“users”中的电子邮件地址。“email_address”必须是唯一的,则成功的事务不能在该列中写入重复的电子邮件地址。不成功的交易也不能。
当有人杀死数据库服务器时,仍在执行的事务也不能。
我认为Transaction isolation是行为上最接近PRAM一致性的ACID概念。SQL dbms通常有几个用于设置事务隔离级别的选项。
SQL Server's options
发布于 2014-05-16 06:35:57
好吧,一个简单的答案是,SERIALIZABLE隔离级别意味着完全一致性。因此,在该模型下,兼容的RDBMS将提供PRAM保证。
在问题中,您对事务的使用是令人困惑的。似乎“客户”之于你就像“交易”之于PRAM模型/维基百科页面。问题中明确的交易似乎没有任何用处。
对于SQL Server,答案是肯定的。如果语句1读取1,则语句2将始终读取1。所有隔离级别都是如此。
然而,SQL Standard并没有强制这样做!例如,READ COMMITTED可以通过从变化很大的时间点读取提交的数据来满足。这并不是因果一致的。
https://stackoverflow.com/questions/23689100
复制相似问题