mysql-排序事务:ER_LOCK_WAIT_TIMEOUT
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql-排序事务:ER_LOCK_WAIT_TIMEOUT,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2770字,纯文字阅读大概需要4分钟。
内容图文
我在使用mysql(5.6.17)进行事务续集时遇到问题,我有一个插入语句和两个更新应该全部完成或不执行,但是最终交易.create似乎回滚了,但是driver.update执行了,但没有执行回滚和第三次更新,即trip.update语句,没有任何更改或回滚,控制台挂起,几秒钟后抛出此错误:
Executing (42a68c8e-8347-45af-b9a2-7b0e7a89606b): START TRANSACTION;
Executing (42a68c8e-8347-45af-b9a2-7b0e7a89606b): SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
Executing (42a68c8e-8347-45af-b9a2-7b0e7a89606b): SET autocommit = 1;
Executing (42a68c8e-8347-45af-b9a2-7b0e7a89606b): INSERT INTO `transactions` (`id`,`tId`,`total_price`,`company_share`,`driver_share`,`at`) VALUES (DEFAULT,'13',1000,100,900,'2016-07-04 10:44:43');
Executing (default): UPDATE `driver` SET `balance`=`balance` - 100 WHERE `id` = '1'
Executing (default): UPDATE `trip` SET `paid`=1 WHERE `id` = '13'
Executing (42a68c8e-8347-45af-b9a2-7b0e7a89606b): ROLLBACK;
5---SequelizeDatabaseError: ER_LOCK_WAIT_TIMEOUT: Lock wait timeout exceeded; try restarting transaction
交易部分是:
var Sequelize = require('sequelize');
var config = {};
config.sequelize = new Sequelize('mydb', 'root', null, {
host: 'localhost',
port: 3306,
dialect: 'mysql',
logging: true,
pool: {
max: 100,
min: 0,
idle: 10000
},
define: {
timestamps: false
}
});
require('sequelize-isunique-validator')(Sequelize);
var driver = require('./../models/driver.js')(config.sequelize, Sequelize);
var transactions = require('./../models/transactions.js')(config.sequelize, Sequelize);
var trip = require('./../models/trip.js')(config.sequelize, Sequelize);
return config.sequelize.transaction({isolationLevel:Sequelize.Transaction.ISOLATION_LEVELS.READ_COMMITTED},function (t) {
return transactions.create({tId: tripId, total_price: totalPrice, company_share: companyShare, driver_share: driverShare}, {transaction: t})
.then(function (result) {
return driver.update({balance: config.sequelize.literal('`balance` - '+companyShare)}, {where: {id: dId}}, {transaction: t})
.then(function (result) {
return trip.update({paid: 1}, {where: {id: tripId}}, {transaction: t});
});
});
}).then(function (result) {
RequestQueue.hmset(ticket,"ticketState",value.Paid);
res.json({'status': 'success','change':(-company_share)});
}).catch(function (err) {
global.console.log('5---'+err);
res.json({'status': 'failed'});
});
我确信我的模型是正确的,因为我在其他地方使用了它们,没有任何问题,也没有将它们放在此处以保持问题的清洁度和主题性,但是如果它有助于提出意见,请tnx!
解决方法:
您应该在options对象中传递transaction参数.
.then(function (result) {
return driver.update({balance: config.sequelize.literal('`balance` - ' + companyShare)}, {
where: {id: dId},
transaction: t
})
.then(function (result) {
return trip.update({paid: 1}, {where: {id: tripId}, transaction: t});
});
http://docs.sequelizejs.com/en/latest/api/model/#update
内容总结
以上是互联网集市为您收集整理的mysql-排序事务:ER_LOCK_WAIT_TIMEOUT全部内容,希望文章能够帮你解决mysql-排序事务:ER_LOCK_WAIT_TIMEOUT所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。