代码之家  ›  专栏  ›  技术社区  ›  Jeff Storey

使用@Transactional是否禁用grails默认事务管理

  •  6
  • Jeff Storey  · 技术社区  · 12 年前

    根据grails文档,服务在默认情况下是事务性的。但是,我知道您可以通过使用 Transactional 属性

    如果我有这样的服务

    class MyService {
    
        @Transactional(...config...)
        def method1() { }
    
        def method2() { }
    
    }
    

    我的理解是,在这种情况下, method1 将是事务性的,但是 method2 不会。

    如果我有

    class MyService {
    
        def method1() { }
        def method2() { }
    
    }
    

    然后两者 方法1 方法2 两者都将是事务性的。

    这是正确的吗?

    2 回复  |  直到 12 年前
        1
  •  6
  •   Roberto Perez Alcolea    12 年前

    如果您希望将您的服务设置为transactional,则将transactional属性设置为true(这不是必须的,但如果您希望明确服务是transactional的):

    class MyService {
    
        static transactional = true
    
        def method1() { }
        def method2() { }
    
    }
    

    如果您不想:

    class MyService {
    
        static transactional = false
    
        @Transactional(...config...)
        def method1() { }
    
        def method2() { }
    
    }
    

    另一个例子(设置transactional属性不是强制性的,但有助于明确——如果你不是唯一的编码者):

    import org.springframework.transaction.annotation.Transactional
    class BookService {
    
        @Transactional(readOnly = true)
        def listBooks() {
            Book.list()
        }
    
        @Transactional
        def updateBook() {
            // …
        }
    
        def deleteBook() {
            // …
        }
    }
    

    您可以做的另一件事是对整个类进行注释,并覆盖需要不同的方法:

    import org.springframework.transaction.annotation.Transactional
    @Transactional
    class BookService {
    
        @Transactional(readOnly = true)
        def listBooks() {
            Book.list()
        }
    
        def updateBook() {
            // …
        }
    
        def deleteBook() {
            // …
        }
    }
    

    希望这能有所帮助;)

        2
  •  1
  •   mathifonseca Piyush Chaudhari    10 年前

    您可以使用禁用Grails默认事务管理 withTransaction 关闭域以手动管理您的事务,如下所示:

    Account.withTransaction { status ->
        try {
            //write your code or business logic here
        } catch (Exception e) {
            status.setRollbackOnly()
        }
    }
    

    如果抛出异常,则事务将被回滚。