如何解决PySide6+MySQL多用户桌面应用数据不同步问题
问题描述
我开发了一个基于PySide6和MySQL的单用户桌面应用,随着应用规模扩大,现在想支持多用户同时使用,为此创建了两个具备所需权限的测试用户。但启动两个应用实例分别以不同用户连接MySQL时,发现数据无法实时同步:比如用一个用户向表中插入数据,另一个用户查询该表时看不到新记录,只有关闭应用(断开MySQL连接)并重新启动后才能看到。
我有两个疑问:
- 应用启动时打开数据库连接并保持到应用关闭,这种做法是否正确?
- 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支持多用户访问的必要设置
- 用户权限配置:确保测试用户拥有目标数据库和表的必要操作权限:
其中GRANT SELECT, INSERT, UPDATE, DELETE ON testschema.* TO 'testuser'@'%'; FLUSH PRIVILEGES;@'%'允许用户从任意IP连接,本地测试可改为@'localhost'。 - 连接数限制:调整
max_connections参数,确保能支撑你的多用户数量(默认151):
临时生效:
永久生效(修改SET GLOBAL max_connections = 500;my.cnf/my.ini):[mysqld] max_connections = 500 - 全局事务隔离级别:若业务不需要严格的可重复读一致性,可全局设置为
READ COMMITTED,避免每个会话单独配置:[mysqld] transaction-isolation = READ-COMMITTED
内容的提问来源于stack exchange,提问作者milchbubido
相关产品推荐
相关产品推荐

