数据库是否为多个客户端的事务提供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下总是会产生1个表格X?
换句话说,其他客户端是否总是会看到某个客户端以相同的顺序提交的事务,客户端是否提交了这些事务?
更一般的问题:RDBMS确保什么类型的一致性,如果它不是PRAM?
答案 0 :(得分:0)
数据库是否提供PRAM一致性( http://en.wikipedia.org/wiki/PRAM_consistency)用于交易 多个客户。
有点儿。直接一致性模型似乎是atomic。 (但请参见下文。)SQL数据库的关注点不仅仅是RAM中的内容。
RDBMS确保什么类型的一致性,如果它不是PRAM?
ACID:原子,一致,孤立和持久。
一致这里并不意味着一致在并发模型中的含义相同。这里一致意味着事务将数据库从一个有效状态更改为另一个有效状态。成功或失败的事务都不会使数据库处于无效状态。
例如,如果您有一个约束表示“users”中的电子邮件地址。“email_address”必须是唯一的,则成功的事务不能将重复的电子邮件地址写入该列。 不成功的交易也不会。
当有人杀死数据库服务器时,的事务仍然无法执行。
我认为,Transaction isolation是最接近PRAM一致性的ACID概念。 SQL dbms通常有几个用于设置事务隔离级别的选项。
答案 1 :(得分:0)
嗯,一个简单的答案是SERIALIZABLE
隔离级别意味着完全一致性。所以是的,在该模型下,符合标准的RDBMS将提供PRAM保证。
您对交易的使用在问题中令人困惑。对于PRAM模型/维基百科页面来说,“客户”似乎是“交易”。问题中的明确交易似乎没有用处。
对于SQL Server,答案是肯定的。声明2将始终读为1,前提是声明1读取一个。对于所有隔离级别都是如此。
然而,SQL标准并未强制要求这样做!例如,可以通过从极其不同的时间点读取提交的数据来满足READ COMMITTED
。这不是因果关系。