2016-07-04 28 views
2

mysql(5.6.17)でトランザクションを続行する際に問題が発生しました.1つのinsert文と2つの更新がすべて完了するかどうかを問わず、末尾にhowerverがあります。transactions.createはロールバックされますが、driver.updateが実行され、Sequelizeトランザクション:ER_LOCK_WAIT_TIMEOUT

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'}); 
}); 

I」はロールバックとtrip.update文が変更またはロールバック、コンソールがハングアップせずに、数秒後である第三の更新はありません。このエラーをスロー私のモデルが正しいと確信しています。なぜなら、どこか別の場所で問題なく使用していて、問題をきれいに保つためにここに入れないからです。

答えて

3

パラメータをoptionsオブジェクトに渡す必要があります。

.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