2014-04-09 13 views
9

मुझे सही आउटपुट मिल रहा है, और वास्तव में, इन दो संचालन को एक लेनदेन इकाई के रूप में माना जा रहा है; जहां कोई विफल रहता है, दोनों विफल हो जाते हैं।वादे लेनदेन के साथ अनुबंध

इस कोड उदाहरण में: मैं

के लेन-देन कर रहा हूँ

(1) सम्मिलित (2) को अद्यतन

तरह से मैं यह दृष्टिकोण तो फिर अंदर मेरे db संचालन घोंसला है। मेरा सवाल यह है कि यदि यह कोड दुर्घटना से सही है? मैं वादे और knex के लिए नया हूँ।

knex.transaction(function(t) { 
    knex('foo') 
    .transacting(t) 
    .insert({id:"asdfk", username:"barry", email:"[email protected]"}) 
    .then(function() { 
     knex('foo') 
     .where('username','=','bob') 
     .update({email:"[email protected]"}) 
     .then(t.commit, t.rollback) 
    }) 
}) 
.then(function() { 
// it worked 
}, 
function() { 
// it failed 
}); 

यह काम करता है, लेकिन मुझे लगता है कि मैं अभी भी कुछ गलत कर रहा हूं। टिप्पणियों की तलाश में

+0

आप 1 की कोशिश कर सकते हैं) कुछ console.logs जोड़ने जहां '// यह worked' और'// यह विफल रहा है 'टिप्पणियां हैं, और 2) किसी भी तरह विफल होने के लिए सम्मिलित कथन को मजबूर करना? आपके वर्तमान घोंसले के साथ, t.rollback केवल तभी कॉल किया जाता है जब अद्यतन विफल हो जाता है, इसलिए मुझे लगता है कि अगर डालने में विफल रहता है तो यह सही काम नहीं करेगा। – user3374348

उत्तर

21

बाहरी श्रृंखला को उसके साथ जंजीर करने के लिए आपको आंतरिक क्वेरी से एक वादा वापस करने की आवश्यकता है।

आप किसी भी त्रुटि को निगलते हैं क्योंकि आप उन्हें पुनर्स्थापित नहीं करते हैं - इस कारण से .catch() का उपयोग करना बेहतर है क्योंकि यह और अधिक स्पष्ट हो रहा है कि यह क्या हो रहा है - यही सामान्य try-catch कथन के साथ होगा।

knex.transaction(function(t) { 
    return knex('foo') 
    .transacting(t) 
    .insert({id:"asdfk", username:"barry", email:"[email protected]"}) 
    .then(function() { 
     return knex('foo') 
      .where('username','=','bob') 
      .update({email:"[email protected]"}); 
    }) 
    .then(t.commit) 
    .catch(function(e) { 
     t.rollback(); 
     throw e; 
    }) 
}) 
.then(function() { 
// it worked 
}) 
.catch(function(e) { 
// it failed 
}); 

यह बेहतर ढंग से समझने के लिए, यहाँ सिंक्रोनस संस्करण है कि "नकल करते" किया जा रहा है:

try { 
    var t = knex.transaction(); 
    try { 
     knex("foo") 
      .transacting(t) 
      .insert({id:"asdfk", username:"barry", email:"[email protected]"}); 
     knex("foo") 
      .where('username','=','bob') 
      .update({email:"[email protected]"}); 
     t.commit(); 
    } 
    catch (e) { 
     t.rollback(); 
     // As you can see, if you don't rethrow here 
     // the outer catch is never triggered 
     throw e; 
    } 
    // It worked 
} 
catch (e) { 
    //It failed 
} 
+0

वास्तव में सहायक है, लेकिन क्या आपने दूसरे उदाहरण के अपडेट पर लेनदेन को याद नहीं किया? – Juan

संबंधित मुद्दे