<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pg的事務快照功能在9.2版本開始支持,允許事務共享它當時的snapshot給其他的事務使用。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET TRANSACTION SNAPSHOT 命令允許新的事務使用與一個現有事務相同的快照運行。已經存 在的事務必須已經把它的快照用`pg_export_snapshot`函數導出。該函數會返回一個快照標識符,SET TRANSACTION SNAPSHOT需要被給定一個快照標識符來指定要導入的快照。在這個命令中該標識符必須被寫成一個字符串,例如'000003A1-1'。`SET TRANSACTION SNAPSHOT`只能在一個事務的 開始執行,并且要在該事務的第一個查詢或者數據修改語句(`SELECT`、`INSERT`、`DELETE`、`UPDATE`、`FETCH`或`COPY`)之前執行。此外,該事務必須已經被設置 為`SERIALIZABLE`或者`REPEATABLE READ`隔離級別(否則,該快照將被立刻拋棄, 因為`READ COMMITTED`模式會為每一個命令取一個新快照)。 如果導入事務使用了`SERIALIZABLE`隔離級別,那么導入快照 的事務必須也使用該隔離級別。還有,一個非只讀可序列化事務不能導入來自只讀事務的快照。 # <span style="font-size:15px">**實例1:export的事務是repeatable read 隔離級別** </span> 1. session 1開啟repeatable read隔離級別事務,并使用pg_export_snapshot函數導出快照標識 ``` postgres=# begin TRANSACTION ISOLATION LEVEL repeatable read; BEGIN postgres=*# SELECT pg_export_snapshot(); pg_export_snapshot --------------------- 00000004-0000003C-1 (1 row) postgres=*# select * from tbl; data ------ C B (2 rows) ``` 2. session 2 新增數據并commit ``` [postgres@iZbp1bum6107bp8mgzkeunZ ~]$ psql psql (13.0) Type "help" for help. postgres=# INSERT INTO tbl VALUES('A'); INSERT 0 1 postgres=# select * from tbl; data ------ C B A (3 rows) ``` 3. session 3 :默認的read committed的隔離級別下,能看到session 2提交的修改 ,但是在新事務中,通過SET TRANSACTION SNAPSHOTsession 1中export snapshot的事務后,看不到session 2中新增的數據 ``` // 默認的read committed的隔離級別下,能看到session 2提交的修改 postgres=# select * from tbl; data ------ C B A (3 rows) // 導入 session 1 導出的快照,發現導入失敗,因為快照導入事務必須具有可序列化或可重復讀取的隔離級別 postgres=# SET TRANSACTION SNAPSHOT '00000004-0000003C-1'; WARNING: SET TRANSACTION can only be used in transaction blocks ERROR: a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ // 設置事務隔離級別為repeatable read postgres=# BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN // 導入session 1的快照之后,發現看不到session 2的數據 postgres=*# SET TRANSACTION SNAPSHOT '00000004-0000003C-1'; SET postgres=*# select * from tbl; data ------ C B (2 rows) ``` 在session 1 導出快照之后,會在`$PGDATA/pg_snapshots`目錄下生成與snapshot同名的文件,該文件就是快照文件。事務commit之后,文件就會被刪除。 ``` [root@iZbp1bum6107bp8mgzkeunZ pg_snapshots]# l 00000004-0000003C-1 [root@iZbp1bum6107bp8mgzkeunZ pg_snapshots]# cat 00000004-0000003C-1 vxid:4/60 pid:17797 dbid:13580 iso:2 ro:0 xmin:575 xmax:575 xcnt:0 sof:0 sxcnt:0 rec:0 ``` **結論:** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session 1 export snapshot。session 2 通過SET TRANSACTION SNAPSHOT導入session 1 的snapshot。這樣不管session 1 export snapshot后有沒有別的session 提交事務,都不影響session 2。 <br> # <span style="font-size:15px">**實例2:export的事務是read committed隔離級別**</span> 1. session 1開啟read committed隔離級別的事務,插入數據并導出快照 ``` // 事務開始前,插入一條數據 postgres=# insert into tbl values ('A'); INSERT 0 1 // 開啟read committed隔離級別的事務 postgres=# begin TRANSACTION ISOLATION LEVEL read committed; BEGIN postgres=*# SELECT pg_export_snapshot(); pg_export_snapshot --------------------- 00000004-00000048-1 (1 row) postgres=*# select * from tbl; data ------ A (1 row) postgres=*# insert into tbl values ('B'); INSERT 0 1 postgres=*# SELECT pg_export_snapshot(); pg_export_snapshot --------------------- 00000004-00000048-2 (1 row) postgres=*# select * from tbl; data ------ A B (2 rows) ``` 2. session 2中查看,只能看到A數據,不能看到B數據,因為B數據在session 1中的事務中還沒提交 ``` postgres=# select * from tbl; data ------ A (1 row) ``` 3. session 3 中新增一條數據并commit,session 1的事務中可以看到數據 ``` // session 3 插入一條數據 postgres=# INSERT INTO tbl VALUES('C'); INSERT 0 1 // session 1中可以看到這條數據 postgres=*# select * from tbl; data ------ A B C (3 rows) postgres=*# SELECT pg_export_snapshot(); pg_export_snapshot --------------------- 00000004-00000048-3 ``` 4. session 2 中導入快照00000004-00000048-1,則只能查到數據A ``` postgres=# begin TRANSACTION ISOLATION LEVEL repeatable read; BEGIN postgres=*# SET TRANSACTION SNAPSHOT '00000004-00000048-1'; SET postgres=*# select * from tbl; data ------ A (1 row) ``` 5. session 3 中導入快照00000004-00000048-2,也只能查到數據A ``` postgres=# begin TRANSACTION ISOLATION LEVEL repeatable read; BEGIN postgres=*# SET TRANSACTION SNAPSHOT '00000004-00000048-2'; SET postgres=*# select * from tbl; data ------ A (1 row) ``` 6. session 4 中導入快照00000004-00000048-3,則能查看到A、C的數據 ``` postgres=# begin TRANSACTION ISOLATION LEVEL repeatable read; BEGIN postgres=*# SET TRANSACTION SNAPSHOT '00000004-00000048-3'; SET postgres=*# select * from tbl; data ------ A C (2 rows) postgres=*# commit; COMMIT ``` 7. session 5 insert一條新的數據D ``` // session 5 新增一條數據,只查詢到A、C、D,因為B在session 1中的事務中未提交 postgres=# insert into tbl values ('D'); INSERT 0 1 postgres=# select * from tbl; data ------ A C D (3 rows) // session 2和session 3、session 4的查詢結果跟前面一致 // 而session 1中可以看到D postgres=*# select * from tbl; data ------ A B C D (4 rows) ``` 8. session 1執行commit,其他事務中依然看不到其他數據 ![](https://img.kancloud.cn/f6/38/f638c3df58987a2eb65bd54c2e35e83a_1489x905.png) **結論:** repeatable read和serializable是看不到事務中其他事務提交的數據的, read committed則可以看到 <br> **總結:** * import事務快照時,其實只是把執行export事務的當時的txid_current_snapshot傳遞過來. 不會傳遞事務的隔離屬性如(read committed或repeatable read或serializable)。 * 共享事務snapshot的事務之間,除了存在自己修改的數據的差異之外,對于執行export的事務如果是read committed的,它看到的數據和執行import的事務看到的數據也是存在差異的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看