GGTS 3.4 Grails 2.3.3 - 当生成控制器时,这个版本包含了许多我之前从未见过的@Transactional行,我不完全理解他们在做什么。
在控制器的顶部有一行:
@Transactional(readOnly = true)
然后就在某些dB更改操作之前:'保存','更新'和'删除'就行了:
@Transactional
我认为这会为每个dB更改操作将readOnly切换为false。它是否打开了可以提交或回滚的新事务?有没有简单的方法来强制回滚?
'create'操作在它之前没有@Transactional行,尽管它执行'new'db命令来创建特定域类的新实例。如果保存事务未完成或回滚,则新创建但未保存的实例会发生什么?如果没有完成,我想在“创建”视图中引入一个“取消”按钮,以便用户在选择时退出创建 - 用户也可以在不调用保存的情况下导航到创建视图之外。 / p>
-Mike
答案 0 :(得分:0)
没有设置任何属性的标准@Transactional
使用平台默认值。这些取决于您的事务管理器和数据源。但是,它会创建一个可以进行评估或回滚的事务。
没有任何注释的Conroller方法不会参与任何事务(前提是整个类也没有注释)。
在create
的情况下,不需要事务,因为您没有与数据库/事务管理器交互。只需创建一个新的域类实例,例如new MyDomainClass()
根本不与数据库交互,这是您在create
方法中看到的。
简而言之,如果您的用户离开页面或点击取消,您无需担心该实例。
答案 1 :(得分:0)
您可以使用域名的“withTransaction”方法手动管理您的交易,如下所示:
Account.withTransaction {status - >
尝试{ 在这里编写代码或业务逻辑 } catch(例外e){
status.setRollbackOnly()
} }
如果生成异常,则此事务将回滚