使用psycopg2的兩階段提交示例 改進版

2021-09-28 12:43:09 字數 1801 閱讀 5369

g_xid = self.pg_master_conn.xid(1, 'gtrid' ,'bqual')

for conn_csr in self.node_conn_csr.values():

l_conn = conn_csr[0]

l_csr = conn_csr[1]

l_conn.tpc_begin(g_xid)

pq_file = open(pq_code_csv_file, 'r')

l_csr.copy_expert(copy_sql, pq_file)

if pq_file:

pq_file.close()

logger.info("=" * 20 + "tpc_prepare" + '=' * 20)

# tpc_prepare 1

try:

""" 在預提交階段的失敗都可以回滾一致,除非ctrl+c/kill剛好在這時發生

"""for conn_csr in self.node_conn_csr.values():

l_conn = conn_csr[0]

l_conn.tpc_prepare()

logger.info("tpc_prepare ok {}".format(l_conn))

except exception as oe:

for conn_csr in self.node_conn_csr.values():

try:

l_conn = conn_csr[0]

l_conn.tpc_rollback()

except exception as oe2:

logger.info(oe2.message + str(l_conn))

raise customexception('tpc_prepare: ' + oe.message, err_code)

# tpc_commit 2

"""在提交階段的失敗不可以回滾,需要在下一次繼續提交修復

# 如果2pc在commit提交階段出現個別失敗的情況,在失敗的節點上會遺留預提交的事務,

# 這裡的處理是,跳過失敗的節點,繼續執行其它節點,失敗的節點在下次執行時重新提交該事務。

# 可以查詢: select * from pg_prepared_xact();

# 在下次執行時,需要檢查是否存在之前的遺留事物,有則重新提交。

# 事物id與g_xid有關

"""#標記tpc_commit是否失敗

tpc_commit_fail = false

logger.info("=" * 20 + "tpc_commit" + '=' * 20)

for conn_csr in self.node_conn_csr.values():

l_conn = conn_csr[0]

try:

l_conn.tpc_commit()

except exception as ce:

logger.info("tpc_commit 提交失敗,繼續" + str(l_conn))

tpc_commit_fail = true

else:

logger.info("tpc_commit ok {}".format(l_conn))

# import time

# time.sleep(10)

if tpc_commit_fail:

# 如果失敗,丟擲異常

raise customexception('tpc_commit 階段有節點失敗!',err_code)

psycopg2使用大全

之前寫過python連線postgresql的方法,今天在網上詳細總結了一下psycopg2的使用方法 使用 ini檔案 python的configparser包可以解析這種型別的配置檔案 儲存資料庫連線的配置資訊。使用psycopg2.connect函式獲得connection物件。使用conne...

使用MinGW編譯Psycopg2

posted by daniele varrazzo on june 5,2011 使用mingw編譯psycopg2 傭工7001 2012.2 我的目的是在windows系統下使用mingw和postgresql客戶端編譯安裝psycopg。我使用了giovanni bajo封裝的mingw g...

MySQL的兩階段所協議2PL

實驗總結 經常聽到別人說2pl,猛的一聽當時真的是一臉懵逼的感覺,啥意思?2pl是什麼玩意?後來又聽人說兩階段鎖協議,這個又是什麼?我咋沒有聽過呢?後來才知這是mysql中的乙個術語 2pl two phase locking 翻譯成中文就是兩階段鎖協議。廢話不多說,我們來用實際的例子體驗一把。實驗...