在Python3开发数据库相关功能时,执行增删改查操作后如果出现处理中等提示报错,通常和数据库事务的提交、回滚逻辑异常有关,也可能是事务隔离级别配置不当或者连接状态异常导致。这类问题如果不及时处理,很容易造成数据不一致或者操作阻塞的情况。

数据库事务相关基础概念
数据库事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务需要满足ACID特性:
- 原子性:事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间某个环节
- 一致性:事务执行前后,数据库的完整性约束没有被破坏
- 隔离性:多个事务并发执行时,一个事务的执行不能被其他事务干扰
- 持久性:事务完成后,该事务对数据库的更改便持久保存在数据库之中
Python3中数据库事务常见报错原因
1. 事务未正确提交或回滚
很多Python数据库驱动默认开启事务,如果执行完操作后没有主动调用提交方法,也没有处理异常时回滚事务,就可能导致操作一直停留在处理中状态,最终触发超时或者报错。
2. 连接未关闭导致事务阻塞
如果数据库连接的游标或者连接对象没有正确关闭,对应的事务会一直持有,其他操作无法获取对应资源,就会出现处理中卡住的情况。
3. 事务隔离级别冲突
不同的事务隔离级别对并发操作的处理规则不同,如果程序设置的事务隔离级别和数据库默认配置冲突,也可能出现操作阻塞报错。
Python3操作数据库事务的正确示例
下面以Python3操作MySQL数据库为例,展示正确的事务处理方式,这里使用pymysql驱动作为示例:
import pymysql
def update_user_score(user_id, score):
# 建立数据库连接
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='test123',
database='test_db',
charset='utf8mb4'
)
# 获取游标对象
cursor = conn.cursor()
try:
# 执行更新操作
sql = "UPDATE user SET score = score + %s WHERE id = %s"
cursor.execute(sql, (score, user_id))
# 事务提交
conn.commit()
print("操作成功,事务已提交")
except Exception as e:
# 出现异常时回滚事务
conn.rollback()
print(f"操作失败,事务已回滚,错误信息:{e}")
finally:
# 关闭游标和连接,释放资源
cursor.close()
conn.close()
if __name__ == "__main__":
update_user_score(1, 10)
报错排查步骤
如果遇到处理中相关的数据库事务报错,可以按照以下步骤排查:
- 检查代码中是否有显式的
commit()和rollback()调用,确保正常和异常分支都覆盖了事务处理 - 检查数据库连接和游标是否在操作完成后正确关闭,建议使用try-finally或者上下文管理器管理资源
- 查看数据库的进程列表,确认是否有长时间运行未提交的事务阻塞了当前操作
- 检查数据库的事务隔离级别配置,确认是否和程序中的设置匹配
注意事项
不同的数据库驱动事务默认行为可能不同,比如sqlite3默认是开启事务的,而有些驱动可能默认自动提交。开发前需要查阅对应驱动的官方文档,确认事务的默认配置。另外,长事务会占用更多数据库资源,尽量避免在事务中执行耗时较长的非数据库操作,比如调用外部接口、处理大文件等。