1. 程式人生 > >Spring中的程式設計式事務與宣告式事務

Spring中的程式設計式事務與宣告式事務

程式設計式事務:

使用PlatformTransactionManager及TransactionTemplate ,其中PlatformTransactionManager可在xml檔案中配置

1.宣告資料來源

2.宣告一個事務管理類,例如:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等 

<bean id="dsTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="stptdemo" />
	</bean>

需要注入dataSource資料來源。

3.事務處理方式:(TransactionTemplate也是為我們省去了部分事務提交、回滾程式碼;定義事務模板時,需注入事務管理物件。 )

private static PlatformTransactionManager transactionManager;
	try{
			TransactionTemplate tt = new TransactionTemplate(transactionManager);
			tt.execute(new TransactionCallback() {
				public Object doInTransaction(TransactionStatus status) {
					JdbcTemplate jt = DbUtil.getJdbcTemplate("stptdemo");
					StatInstance instance = new AuditStatInstance(jt);
					instance.action(list, sql);
					return null;
				}
			});  
		}catch(Exception e){
			log.error("service error:"+e.getMessage());
		}

public static PlatformTransactionManager getTransactionManager() {
		return transactionManager;
	}

	@Resource(name="dsTransactionManager")
	public void setTransactionManager(PlatformTransactionManager transactionManager) {
		AuditManager.transactionManager = transactionManager;
	}


宣告式事務:

提供了TransactionInterceptor攔截器和常用的代理類TransactionProxyFactoryBean,可以直接對元件進行事務代理。

也可使用全註解方式。

1.定義資料來源

2 配置事務管理器 xml中配置事務管理器,注入sessionfactory

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
       	<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
	

具體實現類中:

3.全註解配置

@Transactional(value="txManager" propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
/* 功能模組入口點,beanid即資料庫配置中的name */
@Service("sampleService")
@Scope("prototype")
public class SampleService implements ITaskService