Grails - 使用回滚管理数据库事务

时间:2014-07-03 16:12:54

标签: database grails transactions

GGTS 3.4 Grails 2.3.3 - 当生成控制器时,这个版本包含了许多我之前从未见过的@Transactional行,我不完全理解他们在做什么。

在控制器的顶部有一行:

@Transactional(readOnly = true)

然后就在某些dB更改操作之前:'保存','更新'和'删除'就行了:

@Transactional

我认为这会为每个dB更改操作将readOnly切换为false。它是否打开了可以提交或回滚的新事务?有没有简单的方法来强制回滚?

'create'操作在它之前没有@Transactional行,尽管它执行'new'db命令来创建特定域类的新实例。如果保存事务未完成或回滚,则新创建但未保存的实例会发生什么?如果没有完成,我想在“创建”视图中引入一个“取消”按钮,以便用户在选择时退出创建 - 用户也可以在不调用保存的情况下导航到创建视图之外。 / p>

-Mike

2 个答案:

答案 0 :(得分:0)

没有设置任何属性的标准@Transactional使用平台默认值。这些取决于您的事务管理器和数据源。但是,它会创建一个可以进行评估或回滚的事务。

没有任何注释的Conroller方法不会参与任何事务(前提是整个类也没有注释)。

create的情况下,不需要事务,因为您没有与数据库/事务管理器交互。只需创建一个新的域类实例,例如new MyDomainClass()根本不与数据库交互,这是您在create方法中看到的。

简而言之,如果您的用户离开页面或点击取消,您无需担心该实例。

答案 1 :(得分:0)

您可以使用域名的“withTransaction”方法手动管理您的交易,如下所示:

Account.withTransaction {status - >

尝试{      在这里编写代码或业务逻辑    } catch(例外e){

  status.setRollbackOnly()

} }

如果生成异常,则此事务将回滚