MST

星途 面试题库

面试题:Python多线程操作MySQL数据库中如何处理资源竞争问题

在Python使用多线程操作MySQL数据库时,由于多个线程可能同时访问和修改数据库资源,会引发资源竞争问题。请阐述你知道的处理这种资源竞争问题的方法,并给出简单的代码示例,使用`threading`模块和`mysql - connector - python`库。
39.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

处理方法

  1. 锁机制:使用互斥锁(Mutex)来确保在同一时间只有一个线程能够访问和修改数据库资源。当一个线程获取到锁后,其他线程必须等待锁被释放才能进行操作,从而避免资源竞争。

代码示例

import threading
import mysql.connector

# 创建数据库连接
mydb = mysql.connector.connect(
    host="localhost",
    user="your_user",
    password="your_password",
    database="your_database"
)

# 创建游标
cursor = mydb.cursor()

# 创建互斥锁
lock = threading.Lock()


def insert_data(name, age):
    try:
        # 获取锁
        lock.acquire()
        sql = "INSERT INTO your_table (name, age) VALUES (%s, %s)"
        val = (name, age)
        cursor.execute(sql, val)
        mydb.commit()
        print(cursor.rowcount, "记录插入成功。")
    finally:
        # 释放锁
        lock.release()


# 创建线程
thread1 = threading.Thread(target=insert_data, args=("Alice", 25))
thread2 = threading.Thread(target=insert_data, args=("Bob", 30))

# 启动线程
thread1.start()
thread2.start()

# 等待线程执行完毕
thread1.join()
thread2.join()

# 关闭游标和数据库连接
cursor.close()
mydb.close()

上述代码中,lock.acquire() 用于获取锁,lock.release() 用于释放锁。在执行数据库插入操作前后分别获取和释放锁,这样就保证了在同一时间只有一个线程能够执行数据库操作,避免了资源竞争。