Python PyMySQL 事务

什么是事务?

在数据库中,事务是指一系列的数据库操作,它们作为一个逻辑单元执行,要么全部成功执行,要么全部失败回滚。事务的目的是确保数据库的一致性和完整性。

在实际应用中,有些操作可能需要同时修改多个表,并且要保证这些修改要么全部成功,要么全部失败,以避免数据不一致的情况。这时就需要使用事务来确保这一点。

PyMySQL

PyMySQL 是一个用于连接 MySQL 数据库的第三方库,它提供了一个方便的接口来执行 SQL 语句并操作数据库。

要使用 PyMySQL,首先需要安装它。可以通过以下命令来安装:

pip install pymysql

安装完成后,可以通过以下代码导入 PyMySQL:

import pymysql

开启事务

在 PyMySQL 中,要开启一个事务,首先需要获取到数据库连接,并将其设置为自动提交模式为 False。然后可以通过 begin()start_transaction() 方法来开启事务。

下面的示例代码展示了如何开启一个事务:

# 建立数据库连接
conn = pymysql.connect(host='localhost', port=3306, user='root', password='password', database='test', autocommit=False)

# 获取游标
cursor = conn.cursor()

# 开启事务
conn.begin()

begin()start_transaction() 方法后面的代码将会被包含在事务中。

提交事务

一旦事务中的所有操作都执行成功,可以通过 commit() 方法来提交事务。提交事务会将所有的修改保存到数据库中,并将连接的自动提交模式设置为 True。

下面的代码展示了如何提交一个事务:

# 执行事务中的 SQL 语句
cursor.execute("INSERT INTO table1 VALUES (1, 'A')")
cursor.execute("UPDATE table2 SET name='B' WHERE id=2")

# 提交事务
conn.commit()

commit() 方法调用后,事务中的所有操作将会被提交到数据库。

回滚事务

如果事务中的某个操作执行失败,可以通过 rollback() 方法来回滚事务。回滚事务会撤销事务中的所有修改,并将连接的自动提交模式设置为 True。

下面的代码展示了如何回滚一个事务:

try:
    # 执行事务中的 SQL 语句
    cursor.execute("INSERT INTO table1 VALUES (1, 'A')")
    cursor.execute("UPDATE table2 SET name='B' WHERE id=2")
    
    # 提交事务
    conn.commit()
except:
    # 回滚事务
    conn.rollback()

rollback() 方法调用后,事务中的所有操作将会被撤销。

事务的自动提交模式

在 PyMySQL 中,连接的自动提交模式决定了每个 SQL 语句是否自动提交。如果自动提交模式为 True,则每个 SQL 语句都会自动提交;如果自动提交模式为 False,则需要手动调用 commit() 方法来提交事务。

可以通过以下代码来设置连接的自动提交模式:

# 设置自动提交模式为 True
conn.autocommit(True)

# 设置自动提交模式为 False
conn.autocommit(False)

事务的隔离级别

在数据库中,事务的隔离级别决定了不同事务之间的可见性和并发控制的程度。PyMySQL 默认使用的是可重复读(REPEATABLE READ)的隔离级别。

可以通过以下代码来设置事务的隔离级别:

# 设置事务的隔离级别为读未提交(READ UNCOMMITTED)
cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")

# 设置事务的隔离级别为读已提交(READ COMMITTED)
cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")

# 设置事务的隔离级别为可重复读(REPEATABLE READ)
cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ")

# 设置事务的隔离级别为串行化(SERIALIZABLE)
cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE")
``