查看spring API可知 http://www.kuqin.com/spring2.0_doc/index.html
對EJB來說,預設的行為是EJB容器在遇到系統異常
(通常指運行時異常)時自動復原當前事務。EJB CMT遇到應用異常
(例如,除了java.rmi.RemoteException
外別的checked exception)時並不會自動復原。預設式Spring處理聲明式交易管理的規則遵守EJB習慣(只在遇到unchecked exceptions時自動復原),但通常定製這條規則會更有用。
所以
package x.y.service;
public class DefaultFooService implements FooService {
public Foo getFoo(String fooName) {
throw new UnsupportedOperationException();
}
public Foo getFoo(String fooName, String barName) {
throw new UnsupportedOperationException();
}
public void insertFoo(Foo foo) {
throw new UnsupportedOperationException();
}
public void updateFoo(Foo foo) {
throw new UnsupportedOperationException();
}
}
(對該例的目的來說,上例中實作類別(DefaultFooService
)的每個方法在其方法體中拋出UnsupportedOperationException
的做法是恰當的,我們可以看到,事務被建立出來,響應UnsupportedOperationException
的拋出,然後復原。)
@Transactional
有關的設定
在最簡單的形式下,@Transactional
指定一個介面、類、方法必須是事務性的,其預設事務語義為:read/write,PROPAGATION_REQUIRED
,ISOLATION_DEFAULT
,TIMEOUT_DEFAULT
,而且僅當遇到RuntimeException
時復原,而不是Exception
。
改變事務設定的其他可選屬性
Table 9.1. Transactional
註解的屬性
| 屬性 |
類型 |
描述 |
傳播性
|
枚舉型:Propagation
|
可選的傳播性設定 (預設值:PROPAGATION_REQUIRED
) |
隔離性
|
枚舉型:Isolation
|
可選的隔離性層級(預設值:ISOLATION_DEFAULT
) |
唯讀性
|
布爾型 |
讀寫型事務 vs. 唯讀型事務(預設值:false
,即唯讀型事務) |
復原異常類(rollbackFor)
|
一組 Class
類的執行個體,必須是Throwable
的子類 |
一組異常類,遇到時 確保
進行復原。預設情況下checked exceptions不進行復原,僅unchecked exceptions(即RuntimeException
的子類)才進行交易回復。 |
復原異常類名(rollbackForClassname)
|
一組 Class
類的名字,必須是Throwable
的子類 |
一組異常類名,遇到時 確保
進行復原 |
不復原異常類(noRollbackFor)
|
一組 Class
類的執行個體,必須是Throwable
的子類 |
一組異常類,遇到時確保 不
復原。 |
不復原異常類名(noRollbackForClassname)
|
一組 Class
類的名字,必須是Throwable
的子類 |
一組異常類,遇到時確保 不
復原 |
我們推薦你參考 @Transactional
註解的javadoc,其中詳細列舉了上述各項屬性及其可選值。
————————————————————————————————————
通過以上可知,在spring 中運用@Transactional
註解,自己拋出異常UnsupportedOperationException會
復原,拋Exception異常,得作相關的配置才會復原。