2012-05-15 73 views
5

我無法弄清楚如何在Grails應用程序中指定默認事務隔離級別。請幫助並指出我的錯誤所在。以下是詳細信息。如何在Grails中指定默認事務隔離級別

的Grails:1.3.7

數據庫:SQL Server 2008的

DataSource.groovy的:

dataSource { 
    ... 
    driverClassName = "net.sourceforge.jtds.jdbc.Driver" 
    dialect = org.hibernate.dialect.SQLServerDialect 
    defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_UNCOMMITTED 
} 

hibernate { 
    ... 
    connection.isolation = java.sql.Connection.TRANSACTION_READ_UNCOMMITTED 
} 

然後,我通過導航應用程序,並在同一執行以下查詢時間:

SELECT session_id, host_name, program_name, login_name, status, transaction_isolation_level 
FROM sys.dm_exec_sessions 
WHERE host_name IS NOT NULL AND login_name = 'cm' 
ORDER BY host_name, program_name 

返回:

session_id host_name program_name login_name status transaction_isolation_level 
61   ANDREYK-WS jTDS   cm   running 2 

2表示READ_COMMITTED。我期望看到1,即READ_UNCOMMITTED。

如果我明確指定: @Transactional(隔離= Isolation.READ_UNCOMMITTED)

上述查詢按預期返回1。 但是,我不想在我的應用程序中引用所有服務。 我錯過了什麼?

回答

6

這需要的屬性,下設置屬性的datasource configuration

dataSource { 
  ... 
  driverClassName = "net.sourceforge.jtds.jdbc.Driver". 
  dialect = org.hibernate.dialect.SQLServerDialect 
    properties { 
      defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_UNCOMMITTED. 
    } 
} 
+0

感謝您的回答。試過了。應用程序無法啓動。錯誤日誌: org.springframework.beans.NotWritablePropertyException:Bean類[org.springframework.jdbc.datasource.DriverManagerDataSource]的無效屬性'defaultTransactionIsolation':Bean屬性'defaultTransactionIsolation'不可寫或具有無效的setter方法。 setter的參數類型是否與getter的返回類型相匹配? 如果我輸入1而不是java.sql.Connection.TRANSACTION_READ_UNCOMMITTED或嘗試初始化其他屬性,則會失敗。 –

+0

我試着使用oracle數據源,並得到這個錯誤:'不能創建PoolableConnectionFactory(READ_COMMITTED和SERIALIZABLE是唯一有效的事務級別)'。所以看起來設置可能與數據源有關。數據源配置有'readOnly'屬性,我建議你改用它。 – krock

+1

Andrey,你需要在dataSource下添加「pooled = true」來解決你的問題。 –

4

我有一點像我多DS

在你的數據源上定義的這個變化的屬性共享地圖(曲子給你的環境):

def defaultConnectionProperties = [ 
    maxActive: 50, 
    maxIdle: 25, 
    minIdle: 5, 
    initialSize: 5, 
    minEvictableIdleTimeMillis: 60000, 
    timeBetweenEvictionRunsMillis: 60000, 
    maxWait: 10000, 
    defaultTransactionIsolation: java.sql.Connection.TRANSACTION_READ_UNCOMMITTED 
] 

然後每個DS是一樣的東西:

dataSource { 
    pooled = true 
    driverClassName = "net.sourceforge.jtds.jdbc.Driver" 
// driverClassName = "com.p6spy.engine.spy.P6SpyDriver" // use this driver to enable p6spy logging 
    //readOnly = "true" 
    properties = defaultConnectionProperties 
} 

重新啓動您的Grails應用程序。

的奇怪的事情是我看到的初始transaction_isolation_level = 2,但是當我真正打DB連接屬性似乎設置並筆觸到1

你也可以檢查:grailsApplication.config和查找數據源並確認那裏的設置