我正在尝试对数据库进行多次插入,除非所有插入都成功完成,否则会发生回滚。我可以通过像这样包装整个块在 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
我试图在网上找到这方面的例子,但问题似乎有点独特,所以任何输入或建议将不胜感激。