2012-05-15 4 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를 의미합니다. READ_UNCOMMITTED와 같은 1을 볼 것으로 예상됩니다.

내가 명시 적으로 지정하는 경우

: 예상대로 @Transactional (격리 = Isolation.READ_UNCOMMITTED는)

쿼리는 위의 1을 반환합니다. 그러나 내 응용 프로그램의 모든 서비스를 특성화하고 싶지 않습니다. 내가 무엇이 누락 되었습니까? 이 속성에서 설정 될 필요가

답변

6

내가 여러 DS 사용자의 데이터 소스의 상단에

가 정의했듯이 이러한 변화의 비트를 가지고있는 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 : Bean 클래스 [org.springframework.jdbc.datasource.DriverManagerDataSource]의 'defaultTransactionIsolation'속성이 올바르지 않습니다. 'defaultTransactionIsolation'속성에 쓰기가 가능하지 않거나 잘못된 setter 메소드가 있습니다. setter의 매개 변수 유형이 getter의 반환 유형과 일치합니까? java.sql.Connection.TRANSACTION_READ_UNCOMMITTED 대신 1을 입력하거나 다른 속성을 초기화하려고해도 동일한 예외가 발생하여 실패합니다. –

+0

오라클 데이터 소스를 사용하여 이것을 시도한 결과이 오류가 발생했습니다 :'PoolableConnectionFactory를 생성 할 수 없습니다 (READ_COMMITTED 및 SERIALIZABLE 만 유효한 트랜잭션 레벨입니다). ' 따라서 설정은 데이터 소스에 따라 달라질 수 있습니다. 데이터 소스 설정을위한'readOnly' 속성이 있습니다. 대신에 그것을 사용하는 것이 좋습니다. – krock

+1

Andrey, 문제를 해결하려면 dataSource 아래에 "pooled = true"를 추가해야합니다. –

4

의 속성 속성의 공유지도 (사용자 환경에 조정이) :

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 및 데이터 소스를 찾아 설정을 확인하십시오.