1. 事务处理的基本概念与MySQL支持
在数据库操作中,事务(Transaction)是指作为单个逻辑工作单元执行的一系列操作。这些操作要么全部执行成功,要么全部不执行,保持数据库的一致性状态。MySQL作为最流行的关系型数据库之一,提供了完整的事务支持。
事务具有ACID四大特性:
- 原子性(Atomicity):事务是不可分割的工作单位,事务中的操作要么都发生,要么都不发生
- 一致性(Consistency):事务执行前后,数据库从一个一致性状态变到另一个一致性状态
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务
- 持久性(Durability):一旦事务提交,其所做的修改就会永久保存在数据库中
MySQL中并非所有存储引擎都支持事务。常用的InnoDB引擎完全支持事务,而MyISAM引擎则不支持。因此在使用事务前,需要确认表使用的是InnoDB引擎:
sql复制SHOW TABLE STATUS LIKE 'table_name';
1.1 Python连接MySQL的常用库
Python中有多个库可以连接和操作MySQL数据库:
- MySQLdb:经典的MySQL连接库,仅支持Python 2.x
- mysql-connector-python:MySQL官方提供的纯Python驱动
- PyMySQL:纯Python实现的MySQL客户端,兼容Python 3.x
- SQLAlchemy:ORM框架,底层可使用上述任一驱动
本文将使用PyMySQL作为示例,因为它安装简单、兼容性好且完全支持Python 3:
bash复制pip install pymysql
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Python中使用事务的基本流程
2.1 建立数据库连接
使用PyMySQL建立连接时,需要确保autocommit参数设置为False(默认值),这样才能手动控制事务:
python复制import pymysql
# 建立数据库连接
connection = pymysql.connect(
host='localhost',
user='username',
password='password',
database='dbname',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
注意:charset建议使用utf8mb4而非utf8,因为MySQL的utf8只支持最多3字节的字符,无法存储emoji等4字节字符。
2.2 基本事务操作步骤
一个完整的事务处理流程通常包括以下步骤:
python复制try:
# 获取游标
with connection.cursor() as cursor:
# 执行SQL语句1
sql1 = "UPDATE accounts SET balance = balance - 100 WHERE user_id = 1"
cursor.execute(sql1)
# 执行SQL语句2
sql2 = "UPDATE accounts SET balance = balance + 100 WHERE user_id = 2"
cursor.execute(sql2)
# 提交事务
connection.commit()
print("事务提交成功")
except Exception as e:
# 发生错误时回滚
connection.rollback()
print(f"事务执行失败,已回滚: {e}")
finally:
# 关闭连接
connection.close()
2.3 事务的保存点(Savepoint)
对于复杂的事务,可以在事务中设置保存点,允许部分回滚到某个保存点而不是整个事务:
python复制try:
with connection.cursor() as cursor:
# 执行操作1
cursor.execute("INSERT INTO orders (user_id, amount) VALUES (1, 100)")
# 设置保存点
connection.begin()
savepoint1 = connection.savepoint()
try:
# 执行操作2
cursor.execute("UPDATE inventory SET quantity = quantity - 1 WHERE product_id = 101")
# 执行操作3
cursor.execute("INSERT INTO order_items (order_id, product_id) VALUES (LAST_INSERT_ID(), 101)")
except Exception as e:
# 回滚到保存点1
connection.rollback(savepoint1)
print(f"部分操作失败,已回滚到保存点: {e}")
connection.commit()
finally:
connection.close()
3. 事务隔离级别与并发控制
3.1 MySQL的事务隔离级别
MySQL支持四种事务隔离级别,可以在连接时设置或在运行时修改:
- READ UNCOMMITTED(读未提交):最低隔离级别,允许读取未提交的数据变更
- READ COMMITTED(读已提交):只能读取已提交的数据
- REPEATABLE READ(可重复读,MySQL默认级别):同一事务中多次读取同样记录结果一致
- SERIALIZABLE(串行化):最高隔离级别,完全串行执行
设置隔离级别的方法:
python复制# 连接时设置
connection = pymysql.connect(
# 其他参数...
isolation_level='REPEATABLE READ'
)
# 或运行时设置
connection.begin()
cursor.execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED")
3.2 锁机制与死锁处理
MySQL中常见的锁包括:
- 共享锁(S
