事务控制

编程

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

@Service

public 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

回到顶部