【问题标题】:SQL Database transactions and PRAM/FIFO consistencySQL 数据库事务和 PRAM/FIFO 一致性
【发布时间】:2014-05-15 21:34:32
【问题描述】:

数据库是否为多个客户端的事务提供 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?

换句话说,其他客户端是否总是会看到某个客户端提交的事务与该客户端提交的顺序相同?

更一般的问题:如果不是 PRAM,RDBMS 究竟保证了哪种类型的一致性?

【问题讨论】:

    标签: sql transactions consistency


    【解决方案1】:

    数据库是否提供 PRAM 一致性 ( http://en.wikipedia.org/wiki/PRAM_consistency ) 用于交易 多个客户。

    有点。直接一致性模型似乎是atomic。 (但见下文。)SQL 数据库的关注点比 RAM 中发生的事情更广泛。

    如果不是 PRAM,RDBMS 究竟保证了哪种类型的一致性?

    ACID:原子的、一致的、隔离的和持久的。

    这里的

    一致 与并发模型中的一致 含义不同。这里一致意味着事务将数据库从一种有效状态更改为另一种有效状态。成功或失败的事务都不能使数据库处于无效状态。

    例如,如果您有一个约束条件,即“用户”中的电子邮件地址必须是唯一的,那么成功的交易就不能在该列中写入重复的电子邮件地址。 不成功的交易也不能。

    当有人杀死数据库服务器时,仍在执行的事务也不能。

    Transaction isolation 是在行为上最接近 PRAM 一致性的 ACID 概念,我认为。 SQL dbms 通常有几个选项用于设置事务的隔离级别。

    SQL Server's options

    【讨论】:

      【解决方案2】:

      嗯,一个简单的答案是SERIALIZABLE 隔离级别意味着完全一致性。所以是的,在该模型下,一个合规的 RDBMS 将提供 PRAM 保证。

      您对事务的使用在问题中令人困惑。似乎“客户”对您来说就像“交易”对 PRAM 模型/维基百科页面一样。问题中的明确交易似乎没有任何作用。

      对于 SQL Server,答案是肯定的。如果声明 1 为 1,则声明 2 将始终为 1。这适用于所有隔离级别。

      但是,SQL 标准并没有强制要求这样做!例如,READ COMMITTED 可以通过从变化很大的时间点读取提交的数据来满足。这不是因果一致的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        • 2012-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        相关资源
        最近更新 更多