一、集成方式
? 1、采用Spring的IOC,但是事務還是采用Nutz自己管理控制;
??2、采用Spring的聲明式事務管理控制;
二、IOC
直接依據數據源注入即可
@Beanpublic NutDao nutz(DataSource dataSource) {return new NutDao (dataSource);;}
此時Nutz Dao的事務并不能通過Spring的事務來管理(如@Transactional注解、手動事務等),還是通過Nutz本身的 Trans.exec(() -> {}) 進行管理
例:
public void testService() {Trans.exec(() -> {dao.insert("test_table", Chain.make("id", 3));throw new RuntimeException("test exception");});}
三、將事務交給Spring管理
step1:繼承NutDao類,重寫run方法
public class SpringNutDao extends NutDao {public SpringNutDao(DataSource dataSource) {super(dataSource);}@Overridepublic void run(ConnCallback callback) {Connection con = DataSourceUtils.getConnection(getDataSource());try {callback.invoke(con);} catch (Exception e) {if (e instanceof RuntimeException) {throw (RuntimeException) e;} else {throw new RuntimeException(e);}} finally {DataSourceUtils.releaseConnection(con, getDataSource());}}
}
step2:將繼承類注入
@Beanpublic NutDao nutz(DataSource dataSource) {return new SpringNutDao(dataSource);}
step3:將數據源事務管理注入
@Beanpublic DataSourceTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
例1:
@Transactionalpublic void testService() {dao.insert("test_table", Chain.make("id", 3));throw new RuntimeException("test exception");}
例2:
@Autowiredprivate PlatformTransactionManager transactionManager;public void testService() {DefaultTransactionDefinition def = new DefaultTransactionDefinition();TransactionStatus transactionStatus = transactionManager.getTransaction(def);try{dao.insert("test_table", Chain.make("id", 3));throw new RuntimeException("test exception");}catch (Exception e){if (transactionStatus.isCompleted()) {System.out.println("事務已完成,無需回滾");}else {transactionManager.rollback(transactionStatus);}}}
四、XML文件方式
Nutz DAO與spring集成討論 - 6小貝 - 博客園