编程式:可以清楚的定义事务的边界,可以实现细粒度的事务控制,比如你可以通过程序代码来控制你的事务何时开始,何时结束等。
优缺点:
1、事务控制精确
2、事务代码,与业务逻辑处理代码耦合在一起。
事务代码,不能共用,重新写事务控制操作
开发效率低,不便于维护。
package com.test.day46;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
public class TXDemo {
JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/**
* 手动编码,实现jdbcTemplate的事务管理
* 编程式管理
*/
public void updateUserTx() {
/**
* 把前两个update分别看成单独的事务
* 后面两个update看成一个事务
*/
// 不放进去try就单独了
jdbcTemplate.update("update user set name = ? where id = ?", new Object[]{"hw!!!", 3});
jdbcTemplate.update("update user set name = ? where id = ?", new Object[]{"2088!!!", 4});
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
DataSourceTransactionManager dm = new DataSourceTransactionManager(jdbcTemplate.getDataSource());
TransactionStatus tx = dm.getTransaction(defaultTransactionDefinition);
try{
jdbcTemplate.update("update user set name = ? where id = ?", new Object[ ]{"徐振浩更新", 1});
jdbcTemplate.update("update user1 set name = ? where id = ?", new Object[]{"浩振徐更新", 2});
dm.commit(tx);// 提交事务
} catch (Exception e) {
dm.rollback(tx);// 回滚事务
e.printStackTrace();
}
}
}
声明式管理:
如果你并不需要细粒度的事务控制,你可以使用声明式事务,在Spring中,你只需要在Spring配置文件中做一些配置,即可将操作纳入到事务管理中,解除了和代码的耦合,这是对应用代码影响最小的选择,从这一点再次验证了Spring关于AOP概念。当你不需要事务管理的时候,可以直接从Spring配置文件中移除该设置