Spring聲明式事務詳解
1 事務管理

提供的統(tǒng)一的API接口支持不同的資源
提供聲明式事務管理
方便的與spring框架集成
多個資源的事務管理、同步
2 事務抽象
2.1 事務管理器 - PlatformTransactionManager
public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
1
2
3
4
5
6
2.2 事務定義 - TransactionDefinition
public interface TransactionDefinition { int getPropagationBehavior(); int getlsolationLevel(); String getName(); int getTimeout(); boolean isReadOnly(); }
1
2
3
4
5
6
7
2.3 事務隔離機制
TransactionDefinition.ISOLATION_DEFAULT TransactionDefinition.ISOLATION_READ_COMMITTED TransactionDefinition.ISOLATION_READ_UNCOMMITTED TransactionDefinition.ISOLATION_REPEATABLE_READ TransactionDefinition.ISOLATION_SERIALIZABLE
1
2
3
4
5
2.4 事務傳播機制
TransactionDefinition接口定義了如下int 常量:
PROPAGATION_REQUIRED (Default)
支持當前事務; 如果不存在,請創(chuàng)建一個新的。事務定義的默認設置,并且定義了事務同步的作用域
PROPAGATION_SUPPORTS
支持當前事務; 如果不存在,則以非事務方式執(zhí)行。
對于具有事務同步的事務管理器, PROPAGATION_SUPPORTS與根本沒有事務略有不同,因為它定義了同步可能適用的事務范圍。 結果,將為整個指定范圍共享相同的資源(JDBC Connection ,Hibernate Session等)。
準確的行為取決于事務管理器的實際同步配置!
通常,請謹慎使用PROPAGATION_SUPPORTS ! 特別是,不要依賴PROPAGATION_SUPPORTS范圍內(nèi)的
PROPAGATION_REQUIRED
PROPAGATION_REQUIRES_NEW (這可能會在運行時導致同步?jīng)_突)
如果這種嵌套是不可避免的,請確保正確配置事務管理器(通常切換為“實際事務同步”)
PROPAGATION_MANDATORY
PROPAGATION_REQUIRES_NEW
PROPAGATION_NOT_SUPPORTED
不支持當前事務;而是始終以非事務方式執(zhí)行。類似于同名的EJB事務屬性。
實際的事務中止將無法在所有事務管理器中立即使用。 這尤其適用于org.springframework.transaction.jta.JtaTransactionManager ,它要求javax.transaction.TransactionManager對其可用(在標準Java EE中是特定于服務器的)。
事務同步在PROPAGATION_NOT_SUPPORTED作用域內(nèi)不可用。 現(xiàn)有同步將被掛起并適時恢復
TransactionDefinition.PROPAGATION_NEVER
不支持當前事務;如果當前事務存在,則拋異常。類似于同名的EJB事務屬性。事務同步在PROPAGATION_NEVER作用域內(nèi)不可用
PROPAGATION_NESTEDED
REQUIRED
適用于增刪改
SUPPORTS
適用于查詢。
TransactionStatus
Spring提供了PlatformTransactionManager表示事務管理器,所有事務都由它管理。
而事務由TransactionStatus表示。
public interface TransactionStatus extends SavepointManager { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); boolean isCompleted(); }
1
2
3
4
5
6
7
如果手寫事務代碼,使用try…catch如下:
TransactionStatus tx = null; try { // 開啟事務: tx = txManager.getTransaction(new DefaultTransactionDefinition()); // 相關JDBC操作: jdbcTemplate.update("..."); jdbcTemplate.update("..."); // 提交事務: txManager.commit(tx); } catch (RuntimeException e) { // 回滾事務: txManager.rollback(tx); throw e; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
為啥要抽象出PlatformTransactionManager和TransactionStatus?
JavaEE除了提供JDBC事務,還支持分布式事務JTA(Java Transaction API)。分布式事務是指多個數(shù)據(jù)源(比如多個數(shù)據(jù)庫,多個消息系統(tǒng))要在分布式環(huán)境下實現(xiàn)事務的時候,應該怎么實現(xiàn)。分布式事務實現(xiàn)起來非常復雜,簡單說就是通過一個分布式事務管理器實現(xiàn)兩階段提交,但本身數(shù)據(jù)庫事務就不快,基于數(shù)據(jù)庫事務實現(xiàn)的分布式事務就慢得難以忍受,所以使用率不高。
Spring為了同時支持JDBC和JTA兩種事務模型,就抽象出PlatformTransactionManager。
因為我們的代碼只需要JDBC事務,因此,在AppConfig中,需要再定義一個PlatformTransactionManager對應的Bean,它的實際類型是DataSourceTransactionManager:
@Configuration @ComponentScan @PropertySource("jdbc.properties") public class AppConfig { ... @Bean PlatformTransactionManager createTxManager(@Autowired DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } }
1
2
3
4
5
6
7
8
9
10
3 代碼實戰(zhàn)
public OrderService { @Autowire PlatformTransactionManager txManager void buyTicket(BuyTicketDTO dto) { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION REQUIRED); TransactionStatus status = txManager.getTransaction(def); try { //執(zhí)行業(yè)務代碼 txManager.commit(status); } catch (Exception e) { txManager.rollback(status); } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Transactional標簽方式實現(xiàn)1
public OrderService { @Transactonal void buyTicket(BuyTicketDTO dto) { / save order // finish customer pay // transfer tickets } }
1
2
3
4
5
6
7
8
9
Transactional標簽方式實現(xiàn)2
public OrderServiceProxy { void buyTicket(BuyTicketDTO dto) { // get and begin transaction manager from context try{ orderServicelmpl.buyTicket(dto); // commit transaction } catch (Exceptione) { // roolbback transaction } }
1
2
3
4
5
6
7
8
9
10
執(zhí)行原理流程圖
PlatformTransactionManager常見實現(xiàn)
DataSourceTransactionManager
JpaTransactionManager
JmsTransactionManager
JtaTransactionManager
但使用聲明式事務經(jīng)常遇到問題:
數(shù)據(jù)庫連接耗盡
處理中的問題(比如調(diào)用接口超時)
JDBC Spring
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。