顺序交易:ER_LOCK_WAIT_TIMEOUT

A.R*_*R.H 4 mysql transactions sequelize.js

我在使用mysql(5.6.17)进行顺序事务处理时遇到问题,我有一个插入语句和两个更新都应该完成或不执行,transactions.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
Run Code Online (Sandbox Code Playgroud)

交易部分是:

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'});
});
Run Code Online (Sandbox Code Playgroud)

我确定我的模型是正确的,因为我在其他地方使用了它们,没有任何问题,也没有将它们放在此处以保持问题的清洁度和主题性,但是如果有帮助,请在评论中提问!

Ada*_*dam 6

您应该transactionoptions对象内部传递参数。

    .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});
                });
Run Code Online (Sandbox Code Playgroud)

http://docs.sequelizejs.com/zh-CN/latest/api/model/#update