【问题标题】:How to specify default transaction isolation level in Grails如何在 Grails 中指定默认事务隔离级别
【发布时间】:2012-05-15 19:43:49
【问题描述】:

我不知道如何在 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=Isolation.READ_UNCOMMITTED)

上面的查询按预期返回 1。 但是,我不想将所有服务归于我的应用程序中。 我错过了什么?

【问题讨论】:

    标签: grails transactions isolation-level


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。试过了。应用程序无法启动。日志中的错误:org.springframework.beans.NotWritablePropertyException:bean 类 [org.springframework.jdbc.datasource.DriverManagerDataSource] 的属性“defaultTransactionIsolation”无效:Bean 属性“defaultTransactionIsolation”不可写或设置方法无效。 setter 的参数类型是否与 getter 的返回类型匹配?如果我输入 1 而不是 java.sql.Connection.TRANSACTION_READ_UNCOMMITTED 或尝试初始化其他属性,它会失败并出现相同的异常。
    • 我使用 oracle 数据源尝试了这个并得到了这个错误:Cannot create PoolableConnectionFactory (READ_COMMITTED and SERIALIZABLE are the only valid transaction levels)。所以似乎设置可能取决于数据源。数据源配置有一个readOnly 属性,我建议您改用它。
    • Andrey,你需要在dataSource下添加“pooled = true”来解决你的问题。
    【解决方案2】:

    因为我有多个 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 并查找数据源并确认那里的设置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2012-08-01
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多