6

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=Isolation.READ_UNCOMMITTED)

上記のクエリは、期待どおり 1 を返します。ただし、アプリケーション内のすべてのサービスを属性にしたくはありません。私は何が欠けていますか?

4

2 に答える 2

6

これは、データソース構成のプロパティ属性で設定する必要があります。

dataSource {
  ...
  driverClassName = "net.sourceforge.jtds.jdbc.Driver".
  dialect = org.hibernate.dialect.SQLServerDialect
  properties {
    defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_UNCOMMITTED.
  }
}
于 2012-05-15T20:17:05.903 に答える
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を調べてデータソースを探し、そこで設定を確認することもできます。

于 2012-05-16T23:57:45.010 に答える