91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

分析PostgreSQL中的Prepare Transaction特性

發布時間:2021-11-05 15:24:46 來源:億速云 閱讀:315 作者:iii 欄目:關系型數據庫

本篇內容介紹了“分析PostgreSQL中的Prepare Transaction特性”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

比如以下一個應用場景:
數據分別存儲在Oracle和PostgreSQL中,要求事務跨Oracle和PostgreSQL實現事務一致性,使用PG的Prepare Transaction可以(非完美)實現,不過需要引入更高層的事務管理器TM.
1.TM:開啟PostgreSQL和Oracle事務
2.PostgreSQL:對數據進行處理
3.TM:對PG執行Prepare Transaction
4.Oracle:對數據進行處理
5.TM:PG提交事務
6.TM:如第5步出錯,則回滾Oracle事務,否則提交Oracle事務

啟用兩階段提交特性

[pg12@localhost pg121db]$ vim postgresql.conf 
[pg12@localhost pg121db]$ pg_ctl restart
waiting for server to shut down.... done
server stopped
waiting for server to start....2020-02-10 15:24:24.979 CST @ 2122  LOG:  starting PostgreSQL 12.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit
2020-02-10 15:24:24.980 CST @ 2122  LOG:  listening on IPv4 address "0.0.0.0", port 5120
2020-02-10 15:24:24.980 CST @ 2122  LOG:  listening on IPv6 address "::", port 5120
2020-02-10 15:24:24.985 CST @ 2122  LOG:  listening on Unix socket "/data/run/pg12/.s.PGSQL.5120"
2020-02-10 15:24:25.058 CST @ 2122  LOG:  redirecting log output to logging collector process
2020-02-10 15:24:25.058 CST @ 2122  HINT:  Future log output will appear in directory "pg_log".
 done
server started
[pg12@localhost pg121db]$ grep 'prepared' postgresql.conf 
max_prepared_transactions = 10        # zero disables the feature
# Caution: it is not advisable to set max_prepared_transactions nonzero unless
# you actively intend to use prepared transactions.
[pg12@localhost pg121db]$

測試代碼
使用Java語言編寫測試代碼

/*
 *
 */
package testPG;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class TestBoolean {
    public static void main(String[] args) {
        System.out.println("---------- PG -----------");
        try (Connection conn4pg = DriverManager.getConnection("jdbc:postgresql://192.168.26.28:5120/testdb", "pg12",
                "pg12");
                Connection conn4ora = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.18:1521:orcl", "test",
                        "test")) {
            // PG
            System.out.println("---------- PG -----------");
            conn4pg.setAutoCommit(false);
            boolean isOK = TestPG(conn4pg);
            if (!isOK) {
                System.out.println("---------- Fail! -----------");
                return;
            }
            TestPGPreTrans(conn4pg);
            // Oracle
            System.out.println("---------- Oracle -----------");
            conn4ora.setAutoCommit(false);
            isOK = TestOracle(conn4ora);
            // COMMIT
            conn4pg.setAutoCommit(true);
            TestPGEndPreTrans(conn4pg, isOK);
            conn4ora.commit();
            System.out.println("---------- DONE -----------");
        } catch (SQLException se) {
            System.out.println(se.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        } // end try
    }
    public static boolean TestPG(Connection conn) {
        try (PreparedStatement pstmt = conn.prepareStatement("insert into t_pg(id,value) values(?,?)");) {
            pstmt.setInt(1, 1);
            pstmt.setString(2, "PostgreSQL");
            pstmt.execute();
            return true;
        } catch (SQLException se) {
            System.out.println(se.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        } // end try
        return false;
    } // end
    public static void TestPGPreTrans(Connection conn) {
        try (Statement stmt = conn.createStatement()) {
            // 執行
            stmt.execute("prepare transaction 'pt1'");
            stmt.execute("commit");
        } catch (SQLException se) {
            System.out.println(se.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        } // end try
    } // end
    public static void TestPGEndPreTrans(Connection conn, Boolean isOK) {
        try (Statement stmt = conn.createStatement()) {
            // 執行
            if (isOK) {
                stmt.execute("commit prepared 'pt1'");
            } else {
                stmt.execute("rollback prepared 'pt1'");
            }
        } catch (SQLException se) {
            System.out.println(se.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        } // end try
    } // end
    public static boolean TestOracle(Connection conn) {
        try (PreparedStatement pstmt = conn.prepareStatement("insert into t_oracle(id,value) values(?,?)");) {
            pstmt.setInt(1, 1);
            pstmt.setString(2, "Oracle");
            pstmt.execute();
            return true;
        } catch (SQLException se) {
            System.out.println(se.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        } // end try
        return false;
    } // end
} // end Class

成功執行

TEST-orcl@DESKTOP-V430TU3>select * from t_oracle;
        ID VALUE
---------- --------------------
         1 Oracle
[local:/data/run/pg12]:5120 pg12@testdb=# select * from t_pg;
 id |   value    
----+------------
  1 | PostgreSQL
(1 row)

執行失敗
Oracle數據表添加唯一索引,插入會失敗。

TEST-orcl@DESKTOP-V430TU3>alter table t_oracle add primary key(id);
Table altered.

Java日志輸出

---------- PG -----------
---------- PG -----------
---------- Oracle -----------
ORA-00001: 違反唯一約束條件 (TEST.SYS_C0064492)
---------- DONE -----------

查詢PG數據庫

[local:/data/run/pg12]:5120 pg12@testdb=# select * from t_pg;
 id |   value    
----+------------
  1 | PostgreSQL
(1 row)

仍然是1條記錄,實現了跨數據庫的事務一致性。

“分析PostgreSQL中的Prepare Transaction特性”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉树县| 江山市| 屯昌县| 天峨县| 康乐县| 玛多县| 榆中县| 米脂县| 界首市| 托克逊县| 揭阳市| 潮州市| 涟水县| 武乡县| 华池县| 金阳县| 定远县| 临武县| 盐源县| 台中市| 额济纳旗| 长汀县| 紫金县| 日喀则市| 寿光市| 通许县| 临泽县| 微博| 陈巴尔虎旗| 鞍山市| 石河子市| 青河县| 卫辉市| 东宁县| 林州市| 育儿| 高密市| 星座| 南平市| 柳林县| 平顶山市|