Grails2.4.3。多个数据源。发生错误时如何回滚事务?

Grails2.4.3。多个数据源。发生错误时如何回滚事务?,grails,groovy,transactions,multiple-databases,Grails,Groovy,Transactions,Multiple Databases,假设以下情况 我在datasource.groovy中声明了三种不同的数据源(datasource、datasource_b和datasource_c) 我有三个不同的域对象使用这些数据源 在我的控制器中,我从保存对象a、b的服务调用一个方法​​和c。我需要的是,如果发生错误,它们都不会被保存 因此: DataSource.groovy environments { development { dataSource { [...]

假设以下情况

  • 我在datasource.groovy中声明了三种不同的数据源(datasource、datasource_b和datasource_c)
  • 我有三个不同的域对象使用这些数据源
  • 在我的控制器中,我从保存对象a、b的服务调用一个方法​​和c。我需要的是,如果发生错误,它们都不会被保存
因此:

DataSource.groovy

environments {
    development {
        dataSource {
            [...]
        }
        dataSource_b {
            [...]
        }
        dataSource_c {
            [...]
        }
    }
}
    class ObjectA{

    [...]

    static mapping = {
        //use default datasource
    }

}
    class ObjectB{

    [...]

    static mapping = {
        datasource 'b'
        [...]
    }

}
class ObjectC{

    [...]

    static mapping = {
        datasource 'c'
        [...]
    }

}
public savingObjects(ObjectA a,ObjectB b,ObjectC c){ 
    a.save()
    b.save()
    c.save()
}
ObjectA.groovy

environments {
    development {
        dataSource {
            [...]
        }
        dataSource_b {
            [...]
        }
        dataSource_c {
            [...]
        }
    }
}
    class ObjectA{

    [...]

    static mapping = {
        //use default datasource
    }

}
    class ObjectB{

    [...]

    static mapping = {
        datasource 'b'
        [...]
    }

}
class ObjectC{

    [...]

    static mapping = {
        datasource 'c'
        [...]
    }

}
public savingObjects(ObjectA a,ObjectB b,ObjectC c){ 
    a.save()
    b.save()
    c.save()
}
ObjectB.groovy

environments {
    development {
        dataSource {
            [...]
        }
        dataSource_b {
            [...]
        }
        dataSource_c {
            [...]
        }
    }
}
    class ObjectA{

    [...]

    static mapping = {
        //use default datasource
    }

}
    class ObjectB{

    [...]

    static mapping = {
        datasource 'b'
        [...]
    }

}
class ObjectC{

    [...]

    static mapping = {
        datasource 'c'
        [...]
    }

}
public savingObjects(ObjectA a,ObjectB b,ObjectC c){ 
    a.save()
    b.save()
    c.save()
}
ObjectC.groovy

environments {
    development {
        dataSource {
            [...]
        }
        dataSource_b {
            [...]
        }
        dataSource_c {
            [...]
        }
    }
}
    class ObjectA{

    [...]

    static mapping = {
        //use default datasource
    }

}
    class ObjectB{

    [...]

    static mapping = {
        datasource 'b'
        [...]
    }

}
class ObjectC{

    [...]

    static mapping = {
        datasource 'c'
        [...]
    }

}
public savingObjects(ObjectA a,ObjectB b,ObjectC c){ 
    a.save()
    b.save()
    c.save()
}
MyService.groovy

environments {
    development {
        dataSource {
            [...]
        }
        dataSource_b {
            [...]
        }
        dataSource_c {
            [...]
        }
    }
}
    class ObjectA{

    [...]

    static mapping = {
        //use default datasource
    }

}
    class ObjectB{

    [...]

    static mapping = {
        datasource 'b'
        [...]
    }

}
class ObjectC{

    [...]

    static mapping = {
        datasource 'c'
        [...]
    }

}
public savingObjects(ObjectA a,ObjectB b,ObjectC c){ 
    a.save()
    b.save()
    c.save()
}
我使用的是Grails2.4.3,我知道服务中的方法是跨事件的,但是,例如,如果在保存“c”时发生错误,则保存“a”和“b”时不进行任何刷新(保存刷新:true)

有没有办法纠正这种行为我希望避免使用XA数据源。


谢谢

您所描述的正是XA数据源存在的原因。在这种情况下,如果您不想使用XA datsource,那么添加您自己的错误缓存机制并手动回滚更改。是的,我知道,这是XA数据源的目的。我想也许Grails可以提供另一种解决方案。所以我想我会添加自己的错误缓存机制。谢谢你的反馈!您所描述的正是XA数据源存在的原因。在这种情况下,如果您不想使用XA datsource,那么添加您自己的错误缓存机制并手动回滚更改。是的,我知道,这是XA数据源的目的。我想也许Grails可以提供另一种解决方案。所以我想我会添加自己的错误缓存机制。谢谢你的反馈!