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 翻譯成中文就是兩階段鎖協議。廢話不多說,我們來用實際的例子體驗一把。實驗...