zl程序教程

您现在的位置是:首页 >  其它

当前栏目

已解决sqlalchemy.exc.OperationalError: (pymssql.OperationalError) (1205, b‘Transaction (Process ID 277)

解决 ID Process Transaction SqlAlchemy
2023-09-14 09:05:13 时间

已解决sqlalchemy.exc.OperationalError: (pymssql.OperationalError) (1205, b’Transaction (Process ID 277) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.DB-Lib error message 20018, severity 13:\nGeneral SQL Server error: Check messages from the SQL Server\n’)









报错问题



粉丝群里面的一个小伙伴遇到问题跑来私信我,想用python入库,但是发生了报错(当时他心里瞬间凉了一大截,跑来找我求助,然后顺利帮助他解决了,顺便记录一下希望可以帮助到更多遇到这个bug不会解决的小伙伴),报错代码如下所示:

在这里插入图片描述

update1里面的代码用的sqlalchemy提交修改:

engine = sqlalchemy.create_engine('')
with engine.begin() as conn:
	conn.execute(sql)

报错信息内容如下所示

sqlalchemy.exc.OperationalError: (pymssql.OperationalError) (1205, b'Transaction (Process ID 283) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.DB-Lib error message 20018, severity 13:\nGeneral SQL Server error: Check messages from the SQL Server\n')



报错翻译



报错信息内容翻译如下所示

sqlalchemy.exc.操作错误:(pymssql.操作错误)(1205,b’Transaction(进程ID 283)在锁定资源上与另一个进程死锁,已被选为死锁受害者。重新运行事务。DB-Lib错误消息20018,严重性13:\n常规SQL Server错误:检查来自SQL Server的消息\n’)

报错原因



报错原因

这是一个数据库死锁(deadlock)的错误信息。一个死锁是指两个或多个事务(transaction)在互相等待对方释放资源,从而导致所有事务都被阻塞的情况。

本代码的具体报错原因:因为循环插入和提交修改,sqlalchemy提交修改的时候update1/2/3函数都提交完了,但是数据库那边还没运行完(此时Python无法判断是否运行完了),就又执行插入语句了所以导致死锁。





解决方法



要解决这个问题,你需要找到死锁发生的原因。通常,死锁发生在多个事务同时访问同一组资源的时候。你可以使用 SQL Server Management Studio 或其他工具查看数据库的事务和锁定信息,以便找到问题所在。

以下是一些可能有助于解决死锁问题的建议:

重试操作:在发生死锁时,重试操作可能会解决问题。你可以在程序中捕获这个异常并尝试重新运行操作。

减少事务的持续时间:如果你的事务需要锁定大量的资源,那么你可以尝试减少事务的持续时间,或者将事务拆分成多个较小的事务,以减少资源争用的可能性。

修改事务的隔离级别:如果你的事务需要锁定大量的资源,那么你可以尝试降低事务的隔离级别,以减少锁定的数量。但是,这可能会导致其他问题,如数据不一致等。

优化查询语句和索引:查询语句和索引的性能问题可能会导致死锁。你可以尝试优化查询语句和索引,以减少锁定的数量和持续时间。

用pymysql或者pymssql,conn.commit()提交函数可以保证每次都提交修改完成才运行下面的语句:

import pymssql
import pymysql

conn = pymssql.connect()
# 获取游标,目的就是要执行sql语句
cursor = conn.cursor()

sql = """省略"""

try:
    # 执行sql语句
    cursor.execute(sql)
    # 增删改都必须提交数据
    conn.commit()
except:
    # 如果报错就对修改的数据进行撤销,表示数据回滚
    conn.rollback()
# 关闭游标
cursor.close()

# 关闭连接
conn.close()

以上是此问题报错原因的解决方法,欢迎评论区留言讨论是否能解决,如果有用欢迎点赞收藏文章谢谢支持,博主才有动力持续记录遇到的问题!!!

千人全栈VIP答疑群联系博主帮忙解决报错

由于博主时间精力有限,每天私信人数太多,没办法每个粉丝都及时回复,所以优先回复VIP粉丝,可以通过订阅限时9.9付费专栏《100天精通Python从入门到就业》进入千人全栈VIP答疑群,获得优先解答机会(代码指导、远程服务),白嫖80G学习资料大礼包,专栏订阅地址:https://blog.csdn.net/yuan2019035055/category_11466020.html

  • 优点作者优先解答机会(代码指导、远程服务),群里大佬众多可以抱团取暖(大厂内推机会),此专栏文章是专门针对零基础和需要进阶提升的同学所准备的一套完整教学,从0到100的不断进阶深入,后续还有实战项目,轻松应对面试!

  • 专栏福利简历指导、招聘内推、每周送实体书、80G全栈学习视频、300本IT电子书:Python、Java、前端、大数据、数据库、算法、爬虫、数据分析、机器学习、面试题库等等

  • 注意:如果希望得到及时回复,和大佬们交流学习,订阅专栏后私信博主进千人VIP答疑群在这里插入图片描述
    在这里插入图片描述

免费资料获取,更多粉丝福利,关注下方公众号获取

在这里插入图片描述