2010-10-28 36 views
6

我需要在使用ActiveRecord時添加「WITH NOLOCK」?我知道有一種方法可以實現nHibernate,但無法在ActiveRecord中找到它。ActiveRecord:如何添加NOLOCK?

謝謝你的幫助。 問候,

+0

你有沒有想過這個? – Altonymous 2012-01-11 22:19:05

+0

這是我的解決方案 http://stackoverflow.com/questions/1302746/how-do-add-nolock-with-nhibernate/39518098#39518098 – 2016-09-15 18:37:00

回答

1

我知道這是舊的,但這裏是答案:

criteria.SetLockMode(NHibernate.LockMode.None); 
0
module ActiveRecord 
    module ConnectionAdapters 
    class SQLServerAdapter < AbstractAdapter 

     alias :old_raw_select :raw_select 

     def raw_select(sql, name = nil) 
      sql.gsub! %r{FROM\s\[(\w+)\]\s}im, "FROM [\\1] with (nolock)" 
      old_raw_select(sql,name) 
     end 
     end 
    end 
end 
+0

這是哈克.. – 2012-10-11 19:07:17

+0

不再工作:-( – 2016-03-17 20:43:05

1

查詢只需使用:lock => 'WITH (NOLOCK)'工作用ActiveRecord-SQLSERVER適配器(2.3.24和3.2的最新版本.10在撰寫本文時)。

如果你希望它被添加到特定模型的所有查詢,只是把

default_scope :lock => 'WITH (NOLOCK)' 

在模型中。

+0

這將鎖定該行大失敗 – 2013-11-15 15:57:32

+0

WITH(ROWLOCK,UPDLOCK)將被執行 – 2013-11-15 16:02:51

1

添加到您的ActiveRecord模型

default_scope joins('WITH (NOLOCK)') 

做:鎖= '與(NOLOCK)' 將鎖定每一行與 「WITH(ROWLOCK,UPDLOCK)」

+0

您是否可以詳細說明爲什麼您認爲它會鎖定每行額外的鎖?因爲我在這個大的傳統項目中沒有任何問題地使用了這個hack。就我所見,:lock =>'with(NOLOCK)'只是將WITH(NOLOCK)子句添加到查詢中,這裏是來自sqlserver適配器的相應規範 - https://github.com/rails-sqlserver/activerecord-sqlserver -adapter/blob/e95d1f4a4a62932a37d0eefbb3ff4e8a26dfb03b/test/cases/pessimistic_locking_test_sqlserver.rb#L53。我錯過了什麼嗎? – spariev 2013-11-19 16:07:01

+0

不確定,我所知道的是當我使用該代碼時「WITH(ROWLOCK,UPDLOCK)」 – 2013-11-20 16:03:40

+1

看來,目前(v1.3.7及更早版本),當您使用:lock =>'WITH(NOLOCK)'時,activerecord-jdbcmssql-adapter將使用「WITH (ROWLOCK,UPDLOCK)「,而activerecord-sqlserver-adapter會做正確的事情。連接('WITH(NOLOCK)')有時會在您嘗試和使用關聯時生成無效的sql。 – mjc 2014-06-16 15:43:50

0
default_scope { 
    lock('WITH (NOLOCK)') 
} 
>
相關問題