如何处理事务中的pyodbc连接错误?

问题描述 投票:0回答:1

我目前正在为每周运行的 cron 作业编写一个 python 脚本。该脚本通过 pyodbc 连接到 SQL Server 数据库。有读取和写入(插入、删除和更新)。所有写入都将在同一 SQL 事务中使用相同的 pyodbc 游标。这是因为如果存在任何高级错误,我不希望提交一半写入,而另一半则不提交,因为我必须手动将数据库恢复到以前的状态。我希望每次运行之前数据库都相同,因为没有办法真正在中途恢复作业。如果插入或更新了某些记录而其他记录没有插入或更新,这会导致作业和数据库数据出现问题。

如果出现任何高级错误,我将执行

cursor.rollback()
。如果没有错误,我将在关闭数据库连接之前在脚本末尾执行
cursor.commit()

这些是我遇到的一些错误:

('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x274C (10060) (SQLExecDirectW)')
('08S01', '[08S01] [Microsoft][ODBC Driver 17 for SQL Server]Communication link failure (-2147467259) (SQLEndTran)')

我尝试使用重试标志捕获 while 循环中的错误并重新连接到 SQL Server,但这会丢弃前一个事务中未提交的更改。在这一点上,无论如何我基本上都必须重新启动整个工作。

我有一些问题:

有没有办法创建一个游标并继续我中途断开的上一个事务?

在事务完成之前,我应该如何处理 SQL 事务中间的网络错误?

我是否应该在每次写入执行后提交并重构作业,以便在插入期间任何时候失败时都能够恢复?当出现连接问题时,我可以重新连接到 SQL Server,因为不会有任何事务。但是,我不确定这有多可行,或者它是否比在失败时再次运行整个作业更好......

这里的任何指导都会很棒,因为我在网上找不到太多相关信息。

sql-server transactions odbc pyodbc
1个回答
0
投票

有没有办法创建一个游标并继续我中途断开的上一个事务?

不。当连接被终止时,事务将回滚。

在事务完成之前,我应该如何处理 SQL 事务中间的网络错误?

在出现间歇性错误(例如网络故障)时重试整个事务。

© www.soinside.com 2019 - 2024. All rights reserved.