什么是Grails的交易?

时间:2015-04-28 15:34:29

标签: grails

什么是简单解释或示例中的交易?即使阅读docs,我也完全不理解。如果我放transactional = true,我可以回滚,如果有任何错误,否则,如果transactional = false,意味着我无法回滚?

3 个答案:

答案 0 :(得分:7)

使用示例解释Transaction的概念。

  

仅供参考:默认情况下,所有服务都是交易性的,这意味着所有服务   默认情况下,所有服务中的方法也是事务性的。但如果   你添加了事务= true / false 你违反了约定   您必须标记每个方法事务   根据需要进行交易

因此,假设您有一个方法可以调用另外五种方法:

void methodName(){
    task1()
    task2()
    task3()
    task4()
    task5()

}

我用以下方法绘制了上述方法:

enter image description here

现在假设当你调用上面的方法时,执行前三个任务就可以了。

现在该方法如下图所示:
enter image description here

如果该方法是事务性的并且在执行第三个任务后发生了一些恶意,那么所做的就是回滚:
enter image description here

但是,如果该方法不是事务性的,并且在执行第三个任务后发生了一些恶意,那么所有已经完成的工作将被提交:

enter image description here

现在只是从wiki总结数据库上下文中的事务性意义:

  

在原子事务中,一系列数据库操作全部   发生,或什么也没发生。

答案 1 :(得分:3)

事务是一种全有或全无的方法,其目的在于通过其ACID(原子性,一致性,隔离性和持久性)属性来维护数据库完整性。

让我快速浏览一下:

  • Atomicity :如果事务的一部分失败,整个事务将失败,数据库状态保持不变。
  • 一致性:任何事务都会将数据库从一个有效状态转移到另一个有效状态
  • 隔离:事务的并发执行会导致系统状态在串行执行事务时获得
  • 持久性:一旦提交了一个事务,即使出现掉电,崩溃或错误,它也会保持不变

(再次感谢Wikipedia!)

transactional属性设置为true时,Grails会创建一个Spring代理,它包装每个方法调用并提供事务管理。

总而言之,您是对的,从某种意义上说,如果发生错误,将保留ACID属性,并且事务块中的整个操作将回滚到先前的一致状态。

答案 2 :(得分:1)

几年前我在GR8Conf上就Grails的交易做了一次演讲。大约45分钟。您可以找到视频和幻灯片here