如何用Python管理MySQL数据库事务并解决连接异常问题
Python 连接MySQL及事务管理指南
一、解决Python无法连接MySQL的问题
先排查连接失败的核心原因,按以下步骤逐一验证:
安装依赖库:确保已安装MySQL Python驱动,推荐使用官方的
mysql-connector-python:pip install mysql-connector-python或者常用的
pymysql:pip install pymysql核对连接参数:确认
host(本地默认localhost,远程填服务器IP)、port(默认3306)、user、password、database完全匹配MySQL配置,注意密码中的特殊字符无需额外转义,直接传入即可。检查MySQL用户权限:确保当前用户允许从Python运行的主机连接,比如授权远程访问:
GRANT ALL PRIVILEGES ON your_database.* TO 'your_user'@'%' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES;本地连接则用
'your_user'@'localhost'。验证服务与网络:本地环境检查MySQL服务是否启动(Windows:服务列表找MySQL;Linux:
systemctl status mysql);远程环境确认3306端口开放,防火墙未拦截。
基础连接测试代码
import mysql.connector from mysql.connector import Error try: conn = mysql.connector.connect( host="localhost", database="your_db_name", user="your_username", password="your_password" ) if conn.is_connected(): print(f"Connected to MySQL v{conn.get_server_info()}") cursor = conn.cursor() cursor.execute("SELECT DATABASE();") print(f"Current database: {cursor.fetchone()[0]}") except Error as e: print(f"Connection failed: {e}") finally: if conn.is_connected(): cursor.close() conn.close() print("Connection closed")
二、Python中MySQL事务管理
MySQL默认开启自动提交(autocommit=True),要手动管理事务需先关闭自动提交,通过commit()和rollback()控制事务生命周期。
标准事务流程示例
import mysql.connector from mysql.connector import Error try: conn = mysql.connector.connect( host="localhost", database="your_db_name", user="your_username", password="your_password" ) conn.autocommit = False # 关闭自动提交,开启事务 cursor = conn.cursor() # 执行事务内的多个操作 cursor.execute("INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com')") cursor.execute("UPDATE inventory SET quantity = quantity - 2 WHERE item_id = 3") # 可选:验证操作结果 cursor.execute("SELECT quantity FROM inventory WHERE item_id = 3") print(f"Updated inventory quantity: {cursor.fetchone()[0]}") # 提交事务,所有操作生效 conn.commit() print("Transaction committed successfully") except Error as e: print(f"Transaction failed: {e}") # 出错时回滚所有操作 if conn: conn.rollback() print("Transaction rolled back") finally: if conn.is_connected(): cursor.close() conn.close() print("Connection closed")
关键事务操作说明
- 开启事务:设置
conn.autocommit = False后,后续所有SQL操作都属于当前事务,直到commit()或rollback()。 - 提交事务:
conn.commit()将事务内的所有修改持久化到数据库。 - 回滚事务:
conn.rollback()撤销事务内的所有未提交修改,恢复到事务开始前的状态。 - 保存点(Savepoint):针对部分回滚需求,可创建保存点:
cursor.execute("SAVEPOINT savepoint_name") # 执行部分操作 cursor.execute("ROLLBACK TO SAVEPOINT savepoint_name") # 回滚到保存点
三、确保事务稳定运行的注意事项
- 连接池复用:频繁创建/关闭连接会降低性能,使用连接池管理连接:
from mysql.connector import pooling pool = pooling.MySQLConnectionPool( pool_name="mypool", pool_size=5, host="localhost", database="your_db_name", user="your_username", password="your_password" ) conn = pool.get_connection() - 控制事务时长:避免在事务中等待外部输入(如用户操作),防止长时间占用数据库锁,引发性能问题。
- 异常捕获全覆盖:所有事务操作必须包裹在
try-except块中,确保任何异常都能触发回滚,避免数据不一致。 - 测试异常场景:模拟网络中断、主键冲突等异常,验证事务回滚逻辑是否正常工作。
内容的提问来源于stack exchange,提问作者CharanRaj Chandra Kumar
相关产品推荐
相关产品推荐

