需求和事务隔离范围 - MySQL

时间:2015-04-01 20:28:41

标签: php mysql database concurrency transactions

http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html#isolevel_repeatable-read

  

"同一事务中的所有一致读取都会读取快照   由第一次阅读建立。"

  1. 此快照包含什么内容?只有第一次读取,完整表甚至完整数据库读取的行的快照?
  2. 实际上我只想到第一次读取时读取的行的快照,但这让我感到困惑:

    TRANSACTION 1首先启动,然后是2.最后一个" SELECT * FROM B的结果;"在T1中完全相同,就好像我没有同时执行T2一样(直到UPDATE和INSERT都出现了,尽管读写都在不同的表上)

    交易1:

    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    
    START TRANSACTION;
    
    SELECT * FROM A WHERE a_id = 1;
    SELECT SLEEP(8);
    SELECT * FROM B;
    
    COMMIT;
    

    TRANSACTION 2

    SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    
    START TRANSACTION;
    
    UPDATE B SET b_name = 'UPDATE_6' WHERE b_id = 2;
    INSERT INTO B (b_name) VALUES('NEW_5');
    
    COMMIT;
    

    TRANSACTION 1的输出

    # 1st query
    a_id  a_name
    1     a_1
    
    # 3rd query
    b_id b_name
    1    b_1
    2    b_2
    3    b_3 
    

    1. 在我的Web应用程序中,PHP脚本从MySQL数据库(InnoDB)中的文件导入数据。应用程序确保只有这1个写入过程同时进行。但是,可能还有多个并发读者。 现在我想知道,我是否应该,如果是,我怎么能防止以下情况:
    2. 在一个可重复读取的交易中:

      • 读者R1从表T1中读取
      • 读者R1做某事。其他
      • 读者R1从表T2中读取

      如果T1和T2中的数据以任何方式组合在一起,可能会发生,读者在第一步读取一些数据,在第三步中读取相关数据,现在可能不再相关,因为作者已经同时改变了T1和T2。 AFAIK可重复读取仅保证相同的读取返回相同的数据,但第二次读取与第一次读取不同。

      我希望,你知道,我的意思,我担心,我得到某事。这个话题完全错了。

      (一周前我在MySQL论坛上问了这个问题而没有答案:http://forums.mysql.com/read.php?20,629710,629710#msg-629710

1 个答案:

答案 0 :(得分:0)

快照适用于数据库中的所有表。 MySQL文档在此明确指出http://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html

  

一致性读取意味着InnoDB使用多版本来呈现   在某个时间点查询数据库的快照。

  

假设您在默认的REPEATABLE READ隔离中运行   水平。发出一致读取时(即普通SELECT)   声明),InnoDB为您的交易提供了一个时间点   您的查询看到数据库

  

数据库状态的快照适用于其中的SELECT语句   一个事务,不一定是DML语句。