6

関数レベルでトランザクション制御を実装したい。私が欲しいのは、このようなものです。

クラス MyService{

静的トランザクション = false

@Transactional(readOnly = false、伝播 = Propagation.REQUIRES_NEW)

public def saveCountry(){ Country co = new Country(name:'mycountry') co.save() createState()

}

@Transactional(readOnly = false、伝播 = Propagation.REQUIRES_NEW)

public def createState(){ State state = new State(name:'state') state.save() throw new RuntimeException() } }

私が望むのは、createState() が saveCountry() とは無関係に新しいトランザクションを作成し、createState() が失敗した場合、

すでに保存されている国オブジェクトは取り消されません。注釈を付けましたが、望ましい効果が得られません。ここで単一のトランザクションが作成され、例外がスローされると取り消されます。オブジェクトは何も保存されません。

誰でも助けてくれますか

4

1 に答える 1

1

このアプローチを取ることはお勧めしません。createState() メソッドに到達すると、grails は新しいトランザクションを作成する前に、開いているトランザクションを使用しようとします (何も使用できない場合)。

メソッドをトランザクションとして宣言する代わりに、必要な grails コードのみを囲む小さなトランザクション ブロックを使用します。

http://www.grails.org/doc/1.3.x/ref/Domain%20Classes/withTransaction.html

たとえば、次のような場所にブロックを配置できます

State.withTransaction { status -> 
   //all the code in here has an explicit transaction   
}

このトランザクションは、ブロックの最後でフラッシュまたはロールバックし、トランザクションはスプリング オブジェクト TransactionStatus への参照を持ちます。これにより、エラー処理をきめ細かく制御できます。これにより、トランザクション ブロックを大きくすることができますが、トランザクションがいつどこで終了するかを決定できます。

コードを次のように変更します

public def saveCountry() {
    Country.withTransaction { status ->
        Country co = new Country(name:'mycountry')
        co.save()
    }
    createState()
}

public def createState(){
    State.withTransaction { status ->
        State state = new State(name:'state')
        state.save()
        throw new Exception
    }  
}

この場合、国は保存されますが、州のトランザクションはロールバックされます

于 2010-07-31T11:25:52.310 に答える