2012-05-15 6 views
5

Я не могу понять, как указать уровень изоляции транзакций по умолчанию в приложении Grails. Пожалуйста, помогите и укажите, где моя ошибка. Ниже приведены подробности.Как указать уровень изоляции транзакций по умолчанию в 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, как и ожидалось. Однако я не хочу привязывать все службы в своем приложении. Что мне не хватает?

ответ

6

Это должно быть установлено в свойствах атрибута datasource configuration т.е.

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

Спасибо за ответ. Пробовал это. Не удалось запустить приложение. Ошибка в журнале: org.springframework.beans.NotWritablePropertyException: Недопустимое свойство 'defaultTransactionIsolation' из bean-класса [org.springframework.jdbc.datasource.DriverManagerDataSource]: свойство Bean 'defaultTransactionIsolation' не доступно для записи или имеет неверный метод setter. Соответствует ли тип параметра сеттера типу возврата получателя? Он выходит из строя с тем же исключением, если я набираю 1 вместо java.sql.Connection.TRANSACTION_READ_UNCOMMITTED или пытаюсь инициализировать другие свойства. –

+0

Я пробовал это с использованием источника данных oracle и получил эту ошибку: 'Невозможно создать PoolableConnectionFactory (READ_COMMITTED и SERIALIZABLE - единственные допустимые уровни транзакций)'. Похоже, что настройка может быть зависимой от источника данных. Существует атрибут 'readOnly' для конфигурации datasource, я предлагаю вам использовать это вместо этого. – krock

+1

Андрей, вам нужно добавить «pooled = true» в dataSource, чтобы исправить вашу проблему. –

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 и найдите источники данных и подтвердите настройки там

Смежные вопросы