我无法弄清楚如何在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。 但是,我不想在我的应用程序中归因所有服务。 我错过了什么?
答案 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并查找数据源并确认其中的设置