这是因为在MySQL中,自增 ID 是由数据库自动生成的,当多个连接同时向表中插入数据时,每个连接都会获取一个新的自增 ID。如果没有采取适当的并发控制措施,就可能出现获取到其他连接插入的数据的 ID 的情况。
为了避免这种问题,可以使用事务来确保数据操作的原子性。在事务中执行插入操作并获取自增 ID,可以确保同一个事务中的操作是一致的。示例如下:
import pymysql
from pymysql.pool import PyMySQLConnectionPool
pool = PyMySQLConnectionPool(
host='localhost',
user='your_username',
password='your_password',
database='your_database',
max_connections=10,
charset='utf8mb4'
)
def insert_data():
try:
conn = pool.get_connection()
cursor = conn.cursor()
# 开启事务
conn.begin()
# 插入新数据
sql = "INSERT INTO your_table (name, age) VALUES (%s, %s)"
values = ('John Doe', 30)
cursor.execute(sql, values)
# 获取自增id
new_id = cursor.lastrowid
# 提交事务
conn.commit()
print(f"New data inserted with ID: {new_id}")
except Exception as e:
print(f"Error: {e}")
# 出现异常时回滚事务
conn.rollback()
finally:
cursor.close()
conn.close()
在这个示例中,我们在执行插入操作的时候,先开启了一个事务。在事务中执行插入操作并获取自增 ID,然后提交事务。这样可以确保在同一个事务内获取的 ID 就是当前插入操作产生的 ID。
即使有多个任务同时执行 insert_data(),由于使用了事务,每个任务获取到的 new_id 都是当前插入操作产生的 ID,不会出现获取到其他连接插入的数据 ID 的情况。