New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mysql开启连接池后事务操作会被中断,用单连接又有串事务的问题 #408
Comments
多谢反馈,我们研究下怎么解决这个问题 |
好的,我们这边的项目急着上线 这几天要解决这个问提先, 你们要是有什么解决思路来不及实现和发版本的话希望能告知我一声 不胜感激 |
是不是可以这么修改 1. await model.startTrans()...这些方法保持不变,作用仅为生成sql并query 2.修改model.transaction方法,尾部增加一个参数 temporaryConnection,接受布尔值或者一个nodel-mysql的连接实例, 默认为true,即给方法内的sql操作新建一个connection来执行事务, 传false则跟await model.startTrans()执行效果一样 传一个连接实例则用该连接来执行方法内的sql操作 |
或者直接把node-mysql换成 https://github.com/sequelize/sequelize |
已经修复,见: 8d7e89d 请从 GitHub 上下载最新的代码帮忙测试下。(下载完成后,执行 npm install 安装依赖,然后执行 npm run compile 编译) |
好的 |
用 await model.startTrans()和model.transaction方法都可以么 |
现在并发请求会报错[Error] Error: Cannot enqueue Query after invoking quit. |
测试代码如下 |
从日志上观察到是这样的 |
systemMessageModel 不能为一个 global 的实例,在 Action 里实例化应该就可以了 |
好的 我改下代码再试试 |
测试成功了 是不是model实例不能是同一个才能分开创建连接呢? |
恩 是的,同一个 model 会共用一个连接的 |
那如果一个事务中涉及到多个model会怎么处理呢 |
可以通过数据库连接完成,你再更新下。 let model = this.model('aaa');
try{
await model.startTrans();
await model.add({name: 'xxx'});
let model2 = this.model('bbb').db(model.db());
await model2.add({title: 'yyyy'});
await model.commit();
}catch(e){
await model.rollback();
} 用 let model = this.model('aaa');
await model.transaction(async () => {
await model.add({name: 'wwww'});
let model2 = this.model('bbb').db(model.db());
await model2.add({title: 'yyyy'})
}) |
明白了 我试试 |
什么时候发布2.2.8呢 |
会尽快发布,最迟本周五 |
没有确认没问题了,把这个 issue 关了吧 |
恩 关掉吧 我这边暂时没有发现什么问题了 |
已经发布 2.2.8 版本 |
DESC
上次发现开启多连接 mysql事务会乱掉之后改用单连接,最近又发现一个硬伤,单连接情况下如果并发请求的话多个事务貌似会串在一起,症状是select for update失效 事务中的查询排他锁用不了 具体操作为事务中 查询某条记录后修改 前面的请求还没commit 后面的请求的查询就开始了
ENV
Platform:
Node.js Version:
ThinkJS Version:
The text was updated successfully, but these errors were encountered: