You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决PySide6+MySQL多用户桌面应用数据不同步问题

问题描述

我开发了一个基于PySide6和MySQL的单用户桌面应用,随着应用规模扩大,现在想支持多用户同时使用,为此创建了两个具备所需权限的测试用户。但启动两个应用实例分别以不同用户连接MySQL时,发现数据无法实时同步:比如用一个用户向表中插入数据,另一个用户查询该表时看不到新记录,只有关闭应用(断开MySQL连接)并重新启动后才能看到。

我有两个疑问:

  1. 应用启动时打开数据库连接并保持到应用关闭,这种做法是否正确?
  2. MySQL需要进行哪些设置才能支持多用户访问?

更新内容:应用代码片段

启动时的数据库连接代码

db=mysql.connector.connect(
    host= localhost,
    user= testuser,
    passwd= passwd,
    database= testschema
)

db.autocommit=False

查询示例代码

mycursor = db.cursor()
        
self.SQL_String = "SELECT NR, Datum, Art, Auftraggeber, Auftrag_ID FROM auftraege"

mycursor.execute(self.SQL_String)
x = mycursor.fetchall()

for y in x:
    #do something with the data

mycursor.close()

插入示例代码

self.SQL_String = "INSERT INTO auftraege (NR, Datum, Art, Auftraggeber) VALUES (%s, %s, %s, %s)"
self.SQL_Tup = tuple(...)

mycursor = db.cursor()

mycursor.execute(self.SQL_String, self.SQL_Tup)
db.commit()
    
mycursor.close()

解决方案

一、数据无法实时同步的原因及修复

问题核心在于事务隔离级别和连接的会话状态。MySQL默认事务隔离级别是REPEATABLE READ(可重复读),在这个级别下,一个会话开启事务后,会持续读取事务启动时的数据快照,直到事务结束。你设置了db.autocommit=False,意味着每次查询若未显式提交/回滚,会话会一直处于同一事务中,自然看不到其他会话提交的新数据。

修复方法:

  • 给查询操作添加事务提交:执行完查询后,在关闭游标后提交事务,结束当前数据快照:
    mycursor.close()
    db.commit()  # 提交事务,更新会话数据视图
    
  • 或调整事务隔离级别为READ COMMITTED(读已提交),让每次查询都读取最新的已提交数据。可在连接后设置:
    db.cursor().execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")
    

二、“启动时保持连接到关闭”的做法是否正确?

这种做法可行,但要注意两个点:

  • 长时间闲置的连接可能被MySQL服务器主动断开(由wait_timeout和interactive_timeout参数控制,默认8小时),建议在应用中添加连接存活检测,比如定期执行SELECT 1,或在执行操作前检查连接状态,断开时重新连接。
  • 单线程的PySide6应用中,每个实例保持独立连接是合理的,避免多线程共享连接引发的并发问题。

三、MySQL支持多用户访问的必要设置

  1. 用户权限配置:确保测试用户拥有目标数据库和表的必要操作权限:
    GRANT SELECT, INSERT, UPDATE, DELETE ON testschema.* TO 'testuser'@'%';
    FLUSH PRIVILEGES;
    
    其中@'%'允许用户从任意IP连接,本地测试可改为@'localhost'。
  2. 连接数限制:调整max_connections参数,确保能支撑你的多用户数量(默认151):
    临时生效:
    SET GLOBAL max_connections = 500;
    
    永久生效(修改my.cnf/my.ini):
    [mysqld]
    max_connections = 500
    
  3. 全局事务隔离级别:若业务不需要严格的可重复读一致性,可全局设置为READ COMMITTED,避免每个会话单独配置:
    [mysqld]
    transaction-isolation = READ-COMMITTED
    

内容的提问来源于stack exchange,提问作者milchbubido

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:55:14