事务控制
TxConfig.class
/**
* 声明式事务
*
* 环境搭建
* 1. 引入相关依赖,数据源、数据库驱动,spring-jdbc模块
* 2. 配置数据源、JdbcTemplate(Spring提供的简化数据库操作的工具)操作数据
* 3. 给方法上标注@Transaction表示当前方法是一个事务方法
* 4. @EnableTransactionManagement 开启基于注解的事务管理功能
* 5. 配置事务管理器,注册事务管理器在容器中
* @Bean
* public PlatformTransactionManager transactionManager()
*
* 原理:
* 1.@EnableTransactionManagement
* 利用TransactionManagementConfigurationSelector给容器中导入两个组件
* AutoProxyRegistrar
* ProxyTransactionManagementConfiguration
* 2. AutoProxyRegistrar:
* 给容器中注册一个InfrastructureAdvisorAutoProxyCreator组件
* 利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象,代理对象执行方法拦截器链进行方法调用
* 3. ProxyTransactionManagementConfiguration做了什么?
* 给容器中注册事务增强器:
* 1. 事务增强器要用事务注解的信息:AnnotationTransactionAttributeSource解析事务注解信息
* 2. 事务拦截器
* TransactionInterceptor:保存了事务属性,事务管理器
* 它是一个MethodInterceptor
* 在目标方法执行的时候:
* 执行拦截器链
* 事务拦截器
* 1. 先获取事务相关的属性
* 2. 在获取PlatformTransactionManger如果事先没有添加和指定TransactionManager
* 最终会从容器中获取一个PlatformTransactionManger
* 3. 执行目标方法
* 如果异常获取到事务管理器,利用事务管理器回滚该次操作;
* 如果正常,利用事务管理器提交事务
*
*
*/
@Configuration
@ComponentScan("com.lun.tx")
@EnableTransactionManagement
public class TxConfig {
@Bean
public DataSource dataSource() throws Exception {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
//Spring对@Configuration类会特殊处理,给容器中加组件的方法,多次调用都只是从容器中找组件
return new JdbcTemplate(dataSource);
}
//注册事务管理器在容器中
@Bean
public PlatformTransactionManager transactionManager() throws Exception {
return new DataSourceTransactionManager(dataSource());
}
}
UserService.class
@Servicepublic class UserService {
private Logger logger = Logger.getLogger(this.getClass().getName());
@Autowired
private UserDAO userDAO;
public void insert() {
userDAO.insert();
logger.info("插入数据............");
}
}
UserDAO.class
@Repository
public class UserDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional
public void insert() {
String sql = "insert into blog_user(username,age) values(?,?)";
String userName = UUID.randomUUID().toString().substring(0, 5);
jdbcTemplate.update(sql, userName, 20);
int i = 10 / 0;
}
}
以上是 事务控制 的全部内容, 来源链接: utcz.com/z/516897.html