2017-10-18 154 views
1

Knex對交易文檔中有代碼看起來像這樣:何時使用Knex交易()VS鏈斷TRX對象

knex.transaction(function(trx) { 
    var books = [ 
     {title: 'Canterbury Tales'}, 
     {title: 'Moby Dick'}, 
     {title: 'Hamlet'} 
    ]; 

    return trx 
    .insert({name: 'Old Books'}, 'id') 
    .into('catalogues') 
    .then(function(ids) { 
    return Promise.map(books, function(book) { 
     book.catalogue_id = ids[0]; 

     // Some validation could take place here. 

     return trx.insert(info).into('books'); 
    }); 
    }); 
}) 

在這裏,所以我已經看到了廣泛的使用功能transacting()的舉例說是這樣的:

knex.transaction(function(trx) { 
    knex('foo') 
    .transacting(trx) 
    .insert({id:"bar", username:"bar"}) 
    // etc 
}) 

Knex介紹transacting()舉例類似於上面:

由knex.transaction使用,交易方法可鏈接到任何查詢,並將您希望加入查詢的對象作爲交易的一部分傳遞給。

我的問題是:

是什麼trx.insert().into('foo')knex('foo').transacting(trx).insert()你爲什麼要使用一個,而不是其他的區別?

回答

2

是很方便的使用.transacting(trx)當你想在同一事務中執行多個操作:

knex.transaction(function (trx) { 
    return Promise.all([ 
     knex('foo').insert({ name: 'My Name' }).transacting(trx), 
     knex('bar').insert({ field: 'Value' }).transacting(trx) 
    ]) 
    // ---- or something like ---- 
    return Promise.all(SOME_INPUT_VALUES.map(function (value) { 
     return knex('foo_bar').update('lul', value.lul).where('id', value.id).transacting(trx) 
    })) 
}) 

不知道真正的其他方法的具體用法。這可能只是一個風格問題。你有兩個接口,你可以選擇一個你最喜歡的。至於我,我已經習慣了.transacing(trx)

+0

這的確是一個風格問題。使用'.transacting()'是老方法,像knex實例一樣使用'trx'是一種新方法。後來的方式被添加,以便更難忘記設置查詢事務,這很難找到錯誤。所以通常應該使用'trx('table')。insert(...)'樣式。 –