JDBCTemplate
事务管理
直接基于DataSourceTransactionManager
进行管理
public static void main(String[] args) {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
druidDataSource.setUrl("url");
druidDataSource.setUsername("username");
druidDataSource.setPassword("password");
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(druidDataSource);
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
TransactionStatus transaction = transactionManager.getTransaction(defaultTransactionDefinition);
JdbcTemplate jdbcTemplate = new JdbcTemplate(druidDataSource);
String no1 = "AutoMer27a0ae16Aaa0b5Aa41ccAa8305Aae8684e0e2636UAT" + new Random().nextInt(10000);
String no2 = "AutoMer27a0ae16Aaa0b5Aa41ccAa8305Aae8684e0e2636UAT" + new Random().nextInt(10000);
String sql1 = formatSQL(no1);
String sql2 = formatSQL(no2);
jdbcTemplate.execute(sql1);
Object savepoint = transaction.createSavepoint();
jdbcTemplate.execute(sql2);
transaction.rollbackToSavepoint(savepoint);
transactionManager.commit(transaction);
}
基于TransactionTemplate
管理
TransactionTemplate
进行管理实际上就是模板化了基于DataSourceTransactionManager
进行管理的方法,TransactionTemplate
继承了DefaultTransactionDefinition
,且内部有一个PlatformTransactionManager
类型对象,所以最终实现事务的管理还是通过PlatformTransactionManager
和DefaultTransactionDefinition
完成的。
public static void main(String[] args) {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
druidDataSource.setUrl("url");
druidDataSource.setUsername("username");
druidDataSource.setPassword("password");
JdbcTemplate jdbcTemplate = new JdbcTemplate(druidDataSource);
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(druidDataSource);
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
Integer rowCount = transactionTemplate.execute(transactionCallback -> {
String no1 = "AutoMer27a0ae16Aaa0b5Aa41ccAa8305Aae8684e0e2636UATT" + new Random().nextInt(10000);
String no2 = "AutoMer27a0ae16Aaa0b5Aa41ccAa8305Aae8684e0e2636UATT" + new Random().nextInt(10000);
String sql1 = formatSQL(no1);
String sql2 = formatSQL(no2);
jdbcTemplate.execute(sql1);
Object savepoint = transactionCallback.createSavepoint();
jdbcTemplate.execute(sql2);
transactionCallback.rollbackToSavepoint(savepoint);
return 1;
});
System.out.println(rowCount);
}