如何在Grails中指定默认事务隔离级别

时间:2012-05-15 19:43:50

标签: grails transactions isolation-level

我无法弄清楚如何在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。 但是,我不想在我的应用程序中归因所有服务。 我错过了什么?

2 个答案:

答案 0 :(得分:6)

这需要在datasource configuration的属性属性下设置,即

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

答案 1 :(得分: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,但是当我真正点击数据库时,似乎设置了连接属性并且它会轻弹到1。

您还可以检查:grailsApplication.config并查找数据源并确认其中的设置