0

我正在尝试对数据库进行多次插入,除非所有插入都成功完成,否则会发生回滚。我可以通过像这样包装整个块在 TSQL 中轻松做到这一点:

BEGIN TRANSACTION
BEGIN TRY
    --INSERTIONS GO HERE
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
    SELECT Error = 1
END CATCH

现在,如果我尝试使用 PYMSSQL 在 python 中复制这种行为,我会尝试以下操作:

sql=""" SOME SQL CODE HERE """

try:
    cursor = DB.execute(sql)
except:
    DB.rollback()
    print('Fail')
    return False

sql=""" SOME DIFFERENT SQL CODE HERE """

try:
    cursor = DB.execute(sql)
except:
    DB.rollback()
    print('Fail')
    return False

DB.commit()
print('Success')
return True

这导致没有任何事务被提交,在数据库中也看不到任何更改。此外,如果我尝试使用相同的方法在单次插入后提交,则插入是在数据库中进行的,但由于一些复杂的父子依赖项,该任务要求要么进行所有插入,要么根本不进行插入。

我还应该提到,持久数据库连接使用单例保持打开状态,它只是覆盖常规连接方法,但只允许通过以下方式打开一个连接:

def __init__(self, connid='one'):
     self.ensure_conn(connid)

 def ensure_conn(self, connid='one'):
     conn = getattr(self.connection_stack, connid, None)
     if conn is None:
         conn = pymssql.connect(
             self.server, self.user, self.password, self.database)
         self.connection_stack[connid] = conn

 def conn(self, connid='one'):
     self.ensure_conn(connid)
     if connid in self.connection_stack:
         return self.connection_stack[connid]
     else:
         return None

我试图在网上找到这方面的例子,但问题似乎有点独特,所以任何输入或建议将不胜感激。

4

1 回答 1

0

我找到的解决方案是利用 TSQL 中的存储过程并使用 pymssql 的 rpc 功能。这需要 SQL 帐户级别的 EXEC 权限,但出于安全考虑,可以限制为设置存储过程。

通过这样做,您可以利用事务行为在不同表上进行多插入。

cursor.callproc(name, args)
于 2014-10-07T20:15:04.440 回答