PROPAGATION_REQUIRED
class Service { @Transactional(propagation=Propagation.REQUIRED) public void doSomething() { // access a database using a DAO }}如果调用者尚未启动 事务, 则在调用 doSomething()时它将启动新 事务 。
如果此方法的调用者已经开始事务,则使用调用者的事务,并且不会创建新的事务(即,正在运行一个事务)。
如果在doSomething()中引发了异常,则它将被回滚,这意味着调用方还将看到事务回滚。
当doSomething()返回时,事务尚未提交。调用者将提交事务(或可能回滚)。
PROPAGATION_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视为完全独立的事务,因此将其视为两个独立的提交。
PROPAGATION_NESTED
class Service { @Transactional(propagation=Propagation.NESTED) public void doSomething() { // access a database using a DAO }}如果您的JDBC驱动程序和/或数据库支持JDBC保存点,则只能使用NESTED。
如果调用者尚未启动 事务, 则在调用 doSomething()时它将启动新 事务 。
如果此方法的调用者已经开始事务,则使用调用者的事务,并且不会创建新的事务(即,正在运行一个事务)。但是,当输入doSomething()时,会在事务上标记一个“保存点”。
如果在doSomething()中引发了异常,则可以将事务部分回滚到“保存点”。呼叫者将继续进行交易。
当doSomething()返回无异常时,调用者将提交整个事务(或回滚)。
需要注意的重要一点是,数据库仅查看一个事务,并且只有一个提交。



