• ADADADADAD

    Repeatable-Read及Read-Committed有哪些区别[ mysql数据库 ]

    mysql数据库 时间:2024-11-26 22:15:03

    作者:文/会员上传

    简介:

    mysql 默认提供的是Repeatable-Read 可重复读,更适用于oltpRead-Committed 不可重复读 也可以叫做提交读在MySQL中基本有这两种事务隔离级别的设置,默认的RR(Repeatable-Read)和

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    mysql 默认提供的是Repeatable-Read 可重复读,更适用于oltp
    Read-Committed 不可重复读 也可以叫做提交读
    在MySQL中基本有这两种事务隔离级别的设置,默认的RR(Repeatable-Read)和实际中常见的RC(Read-Committed)。两者区别是什么,怎么正确理解,用几个SQL语句就能说明白,就用简单的实验来说明白。

    我们开始吧。

    首先创建一个测试表test,插入一些数据。

    create table test( id int primary key,name varchar(30),memo varchar(30));
    insert into test values(1,'name1','aaaa'),(2,'name2','aaaa'),(3,'name3','aaaa'),(4,'name4','aaaa'),(5,'name5','aaaa');很多情况下,我们会把隔离级别从默认的RR修改为RC,这也是其它很多数据库默认的事务隔离级别。

    我们打开两个窗口,来对比关联测试。


    RC模式下的测试

    1

    窗口1

    >show variables like 'tx_isolation';
    +---------------+----------------+
    | Variable_name | Value |
    +---------------+----------------+
    | tx_isolation | READ-COMMITTED |
    +---------------+----------------+
    1 row in set (0.01 sec)

    >begin; --开启事务
    >select *from test; --查看数据
    +----+-------+------+
    | id | name | memo |
    +----+-------+------+
    | 1 | name1 | aaaa |
    | 2 | name2 | aaaa |
    | 3 | name3 | aaaa |
    | 4 | name4 | aaaa |
    | 5 | name5 | aaaa |
    +----+-------+------+
    5 rows in set (0.00 sec)

    2

    窗口2

    begin; --开启事务
    >update test set name='aaaaa' where id=2; --修改一条记录
    Query OK, 1 row affected (0.06 sec)
    Rows matched: 1 Changed: 1 Warnings: 0
    >commit; --提交事务
    Query OK, 0 rows affected (0.01 sec)

    1

    窗口1

    >select *from test; --查看窗口1中的数据,就会发现原来窗口的数据发生了变化,这是不可重复读的一个典型例子。
    +----+-------+------+
    | id | name | memo |
    +----+-------+------+
    | 1 | name1 | aaaa |
    | 2 | aaaaa | aaaa |
    | 3 | name3 | aaaa |
    | 4 | name4 | aaaa |
    | 5 | name5 | aaaa |
    +----+-------+------+
    5 rows in set (0.00 sec)

    RR模式下的测试

    再来看看RR这个隔离级别,其实有了上面的测试,就相对有底了。这是MySQL默认的隔离级别,会出现幻读的情况。

    1

    窗口1

    首先修改隔离级别从RC到RR

    >set global transaction isolation level repeatable read;
    Query OK, 0 rows affected (0.00 sec)
    ?查看事务隔离级别。
    >show variables like 'tx_isolation';
    +---------------+-----------------+
    | Variable_name | Value |
    +---------------+-----------------+
    | tx_isolation | REPEATABLE-READ |
    +---------------+-----------------+
    1 row in set (0.00 sec)

    >begin; --开启事务
    >select *from test; --查看表test的数据。
    +----+-------+------+
    | id | name | memo |
    +----+-------+------+
    | 1 | name1 | aaaa |
    | 2 | aaaaa | aaaa |
    | 3 | name3 | aaaa |
    | 4 | name4 | aaaa |
    | 5 | name5 | aaaa |
    +----+-------+------+
    5 rows in set (0.00 sec)

    2

    窗口2

    >begin; --开启事务
    >update test set name='RR_test'; --修改表test的数据,所有记录都发生变化。
    Query OK, 5 rows affected (0.01 sec)
    Rows matched: 5 Changed: 5 Warnings: 0
    >commit; --提交事务
    Query OK, 0 rows affected (0.00 sec)

    1

    窗口1


    >select *from test; --在RR模式下,窗口1中的事务因为还没有提交,看到的还是原来的数据。
    +----+-------+------+
    | id | name | memo |
    +----+-------+------+
    | 1 | name1 | aaaa |
    | 2 | aaaaa | aaaa |
    | 3 | name3 | aaaa |
    | 4 | name4 | aaaa |
    | 5 | name5 | aaaa |
    +----+-------+------+
    5 rows in set (0.00 sec)
    >commit; --我们提交窗口1的事务
    Query OK, 0 rows affected (0.00 sec)
    >select *from test; --再次查看数据就发生了变化,实际上窗口1中没有任何的DMl操作。
    +----+---------+------+
    | id | name | memo |
    +----+---------+------+
    | 1 | RR_test | aaaa |
    | 2 | RR_test | aaaa |
    | 3 | RR_test | aaaa |
    | 4 | RR_test | aaaa |
    | 5 | RR_test | aaaa |
    +----+---------+------+
    5 rows in set (0.00 sec)

    Repeatable-Read及Read-Committed有哪些区别.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载