Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails-保存多个对象,如果一个对象未能保存,则回滚所有对象_Grails_Transactions_Gorm - Fatal编程技术网

Grails-保存多个对象,如果一个对象未能保存,则回滚所有对象

Grails-保存多个对象,如果一个对象未能保存,则回滚所有对象,grails,transactions,gorm,Grails,Transactions,Gorm,我需要一次保存多个对象,如果一个对象未能保存,则回滚所有对象。 例如: class Transaction { Item item; } class Item { date lastTransaction; } 如果创建新事务,则需要更改lastTransaction值并保存该项。 如果保存项目失败,则需要回滚事务(反之亦然) 有什么想法吗?创建一个服务方法,并将您的持久性逻辑放在其中。调用save时,如果指定failOnError:true,则如果存在验证问题,将抛出异常并回滚事

我需要一次保存多个对象,如果一个对象未能保存,则回滚所有对象。 例如:

class Transaction {
  Item item;
}

class Item {
  date lastTransaction;
}
如果创建新事务,则需要更改lastTransaction值并保存该项。
如果保存项目失败,则需要回滚事务(反之亦然)


有什么想法吗?

创建一个服务方法,并将您的持久性逻辑放在其中。调用
save
时,如果指定
failOnError:true
,则如果存在验证问题,将抛出异常并回滚事务

def myServiceMethod(...some parameters...) {
    ....
    Item item = new Item(lastTransaction: new Date())
    item.save(failOnError: true)
    Transaction transaction = new Transaction(item: item)
    transaction.save(failOnError: true)
    ...
    return transaction
}

另外,通读一下Grails文档的内容。

创建一个服务方法,并将持久性逻辑放在其中。调用
save
时,如果指定
failOnError:true
,则如果存在验证问题,将抛出异常并回滚事务

def myServiceMethod(...some parameters...) {
    ....
    Item item = new Item(lastTransaction: new Date())
    item.save(failOnError: true)
    Transaction transaction = new Transaction(item: item)
    transaction.save(failOnError: true)
    ...
    return transaction
}

另外,通读一下Grails文档的内容。

真恶心。不要抛出异常以回滚事务。如果事务管理器假定运行时异常意味着您无法控制事务,则会自动回滚事务以防止您造成更大的损害,那么利用的副作用将产生相当高的成本。这有点像孤独,用锤子反复敲打自己的脑袋,所以一些急诊医生,也许护士或医生会花一些时间陪你

回滚事务非常容易,但不幸的是Grails没有公开以下任何内容:

import org.springframework.transaction.interceptor.TransactionAspectSupport

class FooService {

   def someMethod(...) {

      boolean somethingBadHappened = ...
      if (somethingBadHappened) {
         // roll back
         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
      }

      // ok, proceed
      ...
   }
}
稍后,您可以检查当前事务是否使用

TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()

请注意,这在控制器中不起作用,因为事务将在该点结束。

糟糕。不要抛出异常以回滚事务。如果事务管理器假定运行时异常意味着您无法控制事务,则会自动回滚事务以防止您造成更大的损害,那么利用的副作用将产生相当高的成本。这有点像孤独,用锤子反复敲打自己的脑袋,所以一些急诊医生,也许护士或医生会花一些时间陪你

回滚事务非常容易,但不幸的是Grails没有公开以下任何内容:

import org.springframework.transaction.interceptor.TransactionAspectSupport

class FooService {

   def someMethod(...) {

      boolean somethingBadHappened = ...
      if (somethingBadHappened) {
         // roll back
         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
      }

      // ok, proceed
      ...
   }
}
稍后,您可以检查当前事务是否使用

TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()

请注意,这在控制器中不起作用,因为事务将在该点结束。

要回滚事务,您需要抛出RuntimeException您可能希望为域对象使用不同的名称(
BankTransaction
或其他适当的名称),否则,您说的是希望更新事务中的
事务
,但回滚事务如果
事务
更新失败,您的头会爆炸:-)要回滚事务,您需要抛出RuntimeException您可能希望为域对象使用不同的名称(
BankTransaction
或其他合适的东西),否则您说的是想更新交易中的
交易
,但如果
交易
无法更新,您的头会爆炸,则回滚交易:-)您好,谢谢您的回答。我的问题解决了:-)你好,谢谢你的回答。我的问题解决了:-)是的,这也是可行的。但我需要抓取FieldError或ValidationException以显示在.gsp页面中。因此,即使我使用这个,我仍然需要抛出新的异常。您可以返回未能保存的对象并调用
hasrerrors()
getErrors()
,等等。异常是100%不必要的。下面是一个很好的资源,它显示了异常是多么昂贵:-想象一下,如果他们看到Groovy异常,它们的堆栈帧比普通Java异常多得多。我相信你是对的。我会改变我的代码,即使它看起来有点脏,没有例外:-)谢谢提示Burt-如果抛出异常回滚事务被认为是不好的做法,我认为应该更新文档,说()是的,这也是可行的。但我需要抓取FieldError或ValidationException以显示在.gsp页面中。因此,即使我使用这个,我仍然需要抛出新的异常。您可以返回未能保存的对象并调用
hasrerrors()
getErrors()
,等等。异常是100%不必要的。下面是一个很好的资源,它显示了异常是多么昂贵:-想象一下,如果他们看到Groovy异常,它们的堆栈帧比普通Java异常多得多。我相信你是对的。我会改变我的代码,即使它看起来有点脏,没有例外:-)谢谢提示Burt-如果抛出异常回滚事务被认为是不好的做法,我认为应该更新文档说()