PostgreSQL事物隔离级别之可重复读

本文深入探讨了PostgreSQL的可重复读事务隔离级别,解释了在此级别下事务如何处理数据一致性,避免幻读问题。强调了事务在该级别下只能看到开始时已提交的数据,并分析了在并发操作中可能出现的序列化失败情况,包括更新、删除和加锁操作导致的冲突。同时指出,应用需要准备处理因序列化失败而重试的事务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可重复读

    开启可重复读事务
    BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;

    PostgreSQL 在该隔离级别下不会出现 幻读。

    使用这个级别的应用必须准备好由于序列化失败而重试事务。

知识点

    该隔离级别下,查询获取的是事务开始前提交的数据。
    要注意的是:
        读已提交获取的查询命令开始时已提交的数据,一个事务中前后查询到的数据可能不一致。
        可重复读获取的是事务开始前已提交的数据,同一个事务中前后查询获取到的数据是一致的。注意是看到的是事务中第一个非事务控制语句看到快照,而不是事务中当前语句看到额快照。

    在该隔离级别下,查询看不到事务开始前未提交的数据,也看不到其他并发事务在该事务执行过程中提交的数据。

    在该隔离级别下,一个查询可以看到该事务前面未提交的数据。

看到的是事务中第一个非事务控制语句的一个快照。

场景一

    数据表中原有的数据:SELECT * FROM transaction_test;
        id	name	age
        20	TEST	10


    开启一个事务A:只是执行 GEGIN TRANSACTION IOSLATION LEVEL REPEATABLE READ; 不要提交,后面还有操作。
        BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ
        > OK
        > Time: 0.001s

    开启事务B:执行插入操作并提交。
        BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
        INSERT INTO transaction_test VALUES (20, 'TEST----', 20);
        COMMIT;


        BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ
        > OK
        > Time: 0s


        INSERT INTO transaction_test VALUES (20, 'TEST----', 20)
        > Affected rows: 1
        > Time: 0s


        COMMIT
        > OK
        > Time: 0.002s

    此时在事务A中执行查询操作。结果如下。
        id	name	age
        20	TEST	10
        20	TEST----	20

场景二

    数据库表中的数据:SELECT * FROM transaction_test;
        id	name	age
        20	TEST	10
        20	TEST----	20

    开启事务A,只执行一下操作
        BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
        SELECT * FROM transaction_test;

    返回结果:
        id	name	age
        20	TEST	10
        20	TEST----	20

    开启事务B,插入一条数据,并提交。
        BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
        INSERT INTO transaction_test VALUES (120, 'YYYYYYY', 120);
        COMMIT;

        BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ
        > OK
        > Time: 0.001s


        INSERT INTO transaction_test VALUES (120, 'YYYYYYY', 120)
        > Affected rows: 1
        > Time: 0.001s


        COMMIT
        > OK
        > Time: 0.002s

    开启事务C查询,结果如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值