2017-03-18 17 views
8

नोड.जेएस 7 पहले से ही एसिंक/प्रतीक्षा वाक्यविन्यास का समर्थन करता है, अगली लेनदेन में अगर एसिंक/प्रतीक्षा का उपयोग लेनदेन सक्षम नहीं होगा, तो मुझे इसका उपयोग कैसे करना चाहिए?Node.js 7 एसिंक/प्रतीक्षा के साथ अनुक्रमित लेनदेन का उपयोग कैसे करें?

उत्तर

21
let transaction;  

try { 
    // get transaction 
    transaction = await sequelize.transaction(); 

    // step 1 
    await Model.destroy({where: {id}, transaction}); 

    // step 2 
    await Model.create({}, {transaction}); 

    // commit 
    await transaction.commit(); 

} catch (err) { 
    // Rollback transaction if any errors were encountered 
    await transaction.rollback(); 
} 
+0

यह काम नहीं करता जो कोई "प्रबंधित लेन-देन" चाहता है के लिए, यह यह कैसा दिखाई देगा। इस मामले में 'टी' एक वादा है न कि लेनदेन वस्तु। – Pier

+1

@Pier, प्रतीक्षा करें sequelize.transaction() प्रतीक्षा करें और फिर इसका परिणाम प्राप्त करें। टी वादा नहीं है, यह वादा का परिणाम है। –

+0

ओह आप सही हैं, मैंने पूरी तरह से याद किया है कि – Pier

3

उपरोक्त कोड को नष्ट कॉल में एक त्रुटि है।

await Model.destroy({where: {id}, transaction}); 

लेनदेन विकल्प ऑब्जेक्ट का हिस्सा है।

+1

उपरोक्त उत्तर तय - धन्यवाद – pkyeck

1

जवाब user7403683 द्वारा दिए गए async में अप्रबंधित लेन-देन (http://docs.sequelizejs.com/manual/tutorial/transactions.html#unmanaged-transaction-then-callback-)

प्रबंधित लेन-देन के लिए async/इंतजार रास्ते का वर्णन करता है/इंतजार शैली कुछ ऐसी नज़र हो सकता है:

await sequelize.transaction(async t=>{ 
    const user = User.create({ name: "Alex", pwd: "2dwe3dcd" }, { transaction: t}) 
    const group = Group.findOne({ name: "Admins", transaction: t}) 
    // etc. 
}) 

त्रुटि तब होती है, तो लेन-देन है स्वचालित रूप से वापस लुढ़का।

0

स्वीकृत उत्तर एक "अप्रबंधित लेनदेन" है, जिसके लिए आपको commit और rollback स्पष्ट रूप से कॉल करने की आवश्यकता है।

try { 
    // Result is whatever you returned inside the transaction 
    let result = await sequelize.transaction(async (transaction) => { 
     // step 1 
     await Model.destroy({where: {id}, transaction}); 

     // step 2 
     return await Model.create({}, {transaction}); 
    }); 

    // In this case, an instance of Model 
    console.log(result); 
} catch (err) { 
    // Rollback transaction if any errors were encountered 
    console.log(err); 
} 

रोलबैक के लिए, बस लेन-देन समारोह के अंदर एक त्रुटि फेंक:

try { 
    // Result is whatever you returned inside the transaction 
    let result = await sequelize.transaction(async (transaction) => { 
     // step 1 
     await Model.destroy({where: {id}, transaction}); 

     // Cause rollback 
     if(false){ 
      throw new Error('Rollback initiated'); 
     } 

     // step 2 
     return await Model.create({}, {transaction}); 
    }); 

    // In this case, an instance of Model 
    console.log(result); 
} catch (err) { 
    // Rollback transaction if any errors were encountered 
    console.log(err); 
} 
संबंधित मुद्दे