Как указать уровень изоляции транзакции по умолчанию в 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 ответа
Это должно быть установлено в атрибуте свойств конфигурации источника данных, т.е.
dataSource {
...
driverClassName = "net.sourceforge.jtds.jdbc.Driver".
dialect = org.hibernate.dialect.SQLServerDialect
properties {
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_UNCOMMITTED.
}
}
У меня есть немного вариации этого, так как у меня есть несколько 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.
Самое странное, что я вижу начальный транзакционный_isolation_level = 2, но когда я на самом деле попадаю в БД, свойства соединения, кажется, установлены, и оно сбрасывается в 1.
Также вы можете проверить: grailsApplication.config, найти источники данных и подтвердить настройки там.