saveMessage(msg){// 1. 插入消息
db.prepare('INSERT INTO messages ...').run(msg);// 2. 读取当前 count
constcount=db.prepare('SELECT message_count FROM sessions WHERE id = ?').get(msg.sessionId);// 3. 更新 count
db.prepare('UPDATE sessions SET message_count = ? WHERE id = ?').run(count+1,msg.sessionId);}
consttxn=db.transaction(()=>{db.prepare('INSERT INTO messages ...').run(msg);db.prepare('UPDATE sessions SET message_count = message_count + 1 WHERE id = ?').run(msg.sessionId);});txn();
方案 A 更简洁。
## 问题类型
缺陷 / 高 / 后端服务
## 文件位置
`electron/services/session.service.ts`
## 问题描述
saveMessage 实现:
```ts
saveMessage(msg) {
// 1. 插入消息
db.prepare('INSERT INTO messages ...').run(msg);
// 2. 读取当前 count
const count = db.prepare('SELECT message_count FROM sessions WHERE id = ?').get(msg.sessionId);
// 3. 更新 count
db.prepare('UPDATE sessions SET message_count = ? WHERE id = ?').run(count + 1, msg.sessionId);
}
```
非原子操作,并发下:
- 两个 saveMessage 同时读取 count=10
- 各自 +1,更新为 11
- 实际应是 12
## 影响
- message_count 不准
- UI 显示错误
## 建议修复
方案 A(推荐):使用 SQL 表达式
```sql
UPDATE sessions SET message_count = message_count + 1 WHERE id = ?;
```
方案 B:包裹事务
```ts
const txn = db.transaction(() => {
db.prepare('INSERT INTO messages ...').run(msg);
db.prepare('UPDATE sessions SET message_count = message_count + 1 WHERE id = ?').run(msg.sessionId);
});
txn();
```
方案 A 更简洁。
thzxx
added the ??????? labels 2026-07-21 21:56:00 +08:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
问题类型
缺陷 / 高 / 后端服务
文件位置
electron/services/session.service.ts问题描述
saveMessage 实现:
非原子操作,并发下:
影响
建议修复
方案 A(推荐):使用 SQL 表达式
方案 B:包裹事务
方案 A 更简洁。