Как указать уровень изоляции транзакции по умолчанию в 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, найти источники данных и подтвердить настройки там.

Другие вопросы по тегам