spring docs do a梦幻般的工作描述交易传播属性。

但是,我想知道是否有任何众所周知的现实世界范围的示例,可以更彻底地描述在Layman的条款中的每个属性?

有帮助吗?

解决方案

传播_required

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}
.

当dosomething()被调用时,它将启动新事务如果呼叫者尚未启动事务

如果此方法的来电者已经启动了事务,则使用呼叫者的事务,并且没有创建新事务(即播放中有一个事务)。

如果在dosomething()中抛出异常,那么它将被回滚,这意味着呼叫者也将看到交易回滚。

当dosomething()返回事务时,尚未提交。它是呼叫者,将交易(或可能回滚)。

传播_requires_new

class Service {
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void doSomething() {
        // access a database using a DAO
    }
}
.

当dosomething()调用时,它将始终启动新事务。

如果此方法的调用者已经启动了事务(Txnouter),则呼叫者的事务是暂停,并且创建了一个新的事务(txninner)(即播放中有两个事务)。

如果在dosomething()内抛出异常(),则Txninner将被回滚,但来自呼叫者(Txnouter)的“暂停”事务不受影响。

当dosomething()返回而无需异常时,它将提交事务(Txninner)。调用者的事务(TXNouter)将被恢复并未意识到另一个交易已提交。然后,调用者可以在看到拟合时提交或回滚TXnouter。

要注意的重要点是数据库视图txnouter和txninner作为完全独立的事务,因此是两个独立提交。

传播_已有

class Service {
    @Transactional(propagation=Propagation.NESTED)
    public void doSomething() {
        // access a database using a DAO
    }
}
.

嵌套只能使用如果您的jdbc驱动程序和/或数据库支持 jdbc保存点

当dosomething()被调用时,它将启动新事务如果呼叫者尚未启动事务

如果此方法的调用者已经启动了事务,则使用呼叫者的事务,并且没有创建新事务(即播放中有一个事务)。但是,当输入doSomething()时,在事务上标记为“保存点”。

如果在dosomething()中抛出异常(),则可以将事务部分滚动将事务部分滚动到“保存点”。呼叫者将继续交易。

当dosomething()返回而没有例外时,它是将整个事务(或回滚)提交整个事务的呼叫者。

要注意的重要点是数据库只查看一个事务,只有一个提交。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top