2012-01-27 41 views
2

我使用的腳本首先將所有行的狀態設置爲0,然後單獨將某些行的狀態設置爲不同的值。這是每分鐘完成一次。我已經多次注意到,我可以在我的數據庫上執行SELECT操作,並獲得完全不正確的結果,因爲許多或所有行都具有0狀態。這似乎是SELECTs會得到不正確數據的每分鐘一秒的差距。使用續集是否可以進行TRANSACTION?

我想過使用sequelize QueryChainer,但這還不夠,因爲選擇查詢可以輕鬆地獲取一些不正確的數據,而chainer正在做這件事。

所以我想知道sequelize是否有一種方法可以確保我的所有查詢都被阻止並立即發送,因爲我猜測它沒有實際的TRANSACTION支持。

回答

2

你說得對,目前沒有交易支持。您的問題實際上聽起來像你正在做的事情,如:

sequelize.query('UPDATE mytable SET expired=0').success(function() { 
    Mytable.findAll(/* conditions */).success(function(entries) { 
    entries.forEach(function(entry){ entries.updateAttributes({expired:1}) }) 
    Mytable.findAll().success(function(entries){ 
     // check status of entries 
    }) 
    }) 
}) 

此代碼更新某些條目,但不等待它完成。如果你有這樣的事情,你應該使用QueryChainer,就像這樣:

var chainer = new Sequelize.Utils.QueryChainer 

entries.forEach(function(entry) { 
    chainer.add(entry.updateAttributes({ expired: 1 })) 
}) 

chainer.run().success(function() { 
    // now go on here 
}) 

如果不具備上述錯誤並想先收集所有的操作,之後批量執行這些(和串行)做到這一點:

var chainer = new Sequelize.Utils.QueryChainer 

entries.forEach(function(entry) { 
    chainer.add(entry, 'updateAttributes', [{ expired: 1 }]) 
}) 

chainer.runSerially().success(function() { 
    // now go on here 
}) 

希望幫助

+0

不會使它不可能的'SELECT'得到數據,而QueryChainer工作? – Hubro 2012-01-27 19:53:07

+0

爲了澄清,我擔心,因爲每個'UPDATE'分開運行,'SELECT'查詢可能會在更新查詢之間得到一些錯誤的數據 – Hubro 2012-01-27 20:09:16

+0

您能澄清一下嗎? QueryChainer中的所有操作是按順序但分開執行的,還是實際上是作爲一個查詢執行的?我只是不希望'SELECT'語句能夠在QueryChainer運行時獲取數據**,從而得到不正確的數據。 – Hubro 2012-01-28 19:08:47

10

由於提交cf8cd6eb769f2470b58c95e49114c05cdd1e3653(十一月下旬2013)中,交易現在支持Sequelize。這最近已經在npm(1.7.0和2.0.0分支)中可用。 該API在pull request中描述。

你需要的東西,如:

sequelize.transaction(function(t) { 
    Table.update({status: 0}, {}, { transaction: t }); 
    t.commit().success(function() { ... }); 
}; 
+2

注意:我知道這個問題已經過了一年多了,並且有一個可以接受的答案,但我認爲它對於來自Google的用戶仍然有幫助。 – luiscubal 2013-12-16 22:53:48

+0

謝謝,它是。 +1 – dooburt 2014-10-10 11:00:30

+1

文檔:https://sequelize.readthedocs.org/en/latest/docs/transactions/ – topher 2015-02-25 19:17:46

相關問題