暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mogdb psycopg2 驱动实现savepoint 功能

原创 由迪 2023-09-28
123

原作者:李华

客户在使用 mogdb psycopg2驱动执行一个事物过程中希望,部分的失败不影响已经成功的事务的提交,在jdbc odbc驱动中都可以使用参数控制是否开启savepoint功能,在psycopg2驱动中无此选项需要修改代码实现。
希望实现的业务逻辑:
image.png
如果按照默认的逻辑:
image.png
失败的insert 必须回滚而且会把成功的事务也进行回滚处理,使用python 实现该逻辑

import psycopg2
from psycopg2 import errorcodes
from datetime import datetime

def insert_data(cursor, value):
    sql = "INSERT INTO test.t_user (user_id, status) VALUES (%s, %s)"
    cursor.execute(sql, value)

def test_1():
    try:
        start = datetime.now()
        conn = psycopg2.connect(dbname='test', host='10.88.2.11', port=29000, user='test', password='Test#123')
        print("Connect cost [%s]" % (str(datetime.now() - start)))

        conn.autocommit = False  

        cursor = conn.cursor()

        values_to_insert = [('ho', '2'), ('li', '3'),('hua','3'),('mog','3')]  # Values to insert

        try:
   
            savepoint_counter = 0

            for value in values_to_insert:
                savepoint_name = f"sp_{savepoint_counter}"
                cursor.execute(f"SAVEPOINT {savepoint_name}")
                print(f"savepoint: {savepoint_name}")


                try:
                    insert_data(cursor, value)
                    #conn.commit()  
                    print(f"Insert successful: {value}")
                except psycopg2.IntegrityError as e:
                    if e.pgcode != errorcodes.UNIQUE_VIOLATION:
                        raise e

                    print("Unique constraint violation, rolling back to previous savepoint")
                    cursor.execute(f"ROLLBACK TO SAVEPOINT {savepoint_name}")
                    print(f"Insert failed: {value}")
                    print(f"ROLLBACK TO SAVEPOINT: {savepoint_name}") 

                savepoint_counter += 1

            conn.commit()
            print("commit")

        except Exception as e:
            print("Outer error:", e)

    finally:
        if conn:
            conn.close()

def main():
    test_1()

if __name__ == '__main__':
    main()
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论