1、采用Spring的IOC,但是事务还是采用Nutz自己管理控制;
2、采用Spring的声明式事务管理控制;
直接依据数据源注入即可
|
1 2 3 4 |
@Bean public NutDao nutz(DataSource dataSource) { return new NutDao (dataSource);; } |
此时Nutz Dao的事务并不能通过Spring的事务来管理(如@Transactional注解、手动事务等),还是通过Nutz本身的 Trans.exec(() -> {}) 进行管理
例:
|
1 2 3 4 5 6 |
public void testService() { Trans.exec(() -> { dao.insert("test_table", Chain.make("id", 3)); throw new RuntimeException("test exception"); }); } |
step1:继承NutDao类,重写run方法
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class SpringNutDao extends NutDao { public SpringNutDao(DataSource dataSource) { super(dataSource); }
@Override public 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:将继承类注入
|
1 2 3 4 |
@Bean public NutDao nutz(DataSource dataSource) { return new SpringNutDao(dataSource); } |
step3:将数据源事务管理注入
|
1 2 3 4 |
@Bean public DataSourceTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } |
例1:
|
1 2 3 4 5 |
@Transactional public void testService() { dao.insert("test_table", Chain.make("id", 3)); throw new RuntimeException("test exception"); } |
例2:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@Autowired private 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); } }
} |