相关推荐recommended
【Spring进阶系列丨最终篇】一文详解Spring中的事务控制
作者:mmseoamin日期:2024-04-27

0、说明

本篇文章是【Spring进阶系列】专栏的最后一篇文章,至此,我们对Spring的学习就告一段落,接下来我会持续更新【Spring+SpringMVC+MyBatis整合】专栏,欢迎免费订阅!

文章目录

    • 0、说明
    • 一、Spring事务控制
      • 1、事务的环境准备
        • 1.1、导入依赖
        • 1.2、添加AOP的约束
        • 1.3、数据库准备
        • 1.4、定义Bean
        • 1.5、主配置文件定义
        • 1.6、测试
        • 2、基于xml的声明式事务
          • 2.1、配置事务管理器
          • 2.2、配置事务的通知
          • 2.3、配置AOP
          • 2.4、配置事务的属性
          • 3、基于注解的声明式事务
            • 3.1、配置事务管理器
            • 3.2、在业务类添加注解
            • 3.3、配置JdbcTemplate模板
            • 3.4、在Dao类添加注解
            • 3.5、配置类中扫描包
            • 3.6、开启spring对注解事务的支持
            • 3.7、在业务层@Transactional注解
            • 3.8、测试

              【Spring进阶系列丨最终篇】一文详解Spring中的事务控制,在这里插入图片描述,第1张

              一、Spring事务控制

              【Spring进阶系列丨最终篇】一文详解Spring中的事务控制,在这里插入图片描述,第2张

              • 事务需要放在业务层(service)
              • Spring的事务是基于AOP的
              • Spring的事务控制有两种:编程式事务【了解】和声明式事务【重点】
              • 声明式事务分为:基于xml配置和基于注解配置

                1、事务的环境准备

                1.1、导入依赖

                
                        
                        
                            org.springframework
                            spring-context
                            5.2.1.RELEASE
                        
                        
                        
                            org.aspectj
                            aspectjweaver
                            1.9.4
                        
                        
                        
                            org.springframework
                            spring-tx
                            5.2.1.RELEASE
                        
                        
                        
                            mysql
                            mysql-connector-java
                            5.1.48
                        
                  	
                  		
                  		
                            org.springframework
                            spring-jdbc
                            5.2.1.RELEASE
                        
                        
                        
                            junit
                            junit
                            4.12
                            test
                        
                
                

                1.2、添加AOP的约束

                
                
                

                1.3、数据库准备

                create database bank;
                use bank;
                create table t_account(
                	id int primary key auto_increment,
                  	name varchar(30),
                  	balance int
                );
                insert into t_account(name,balance) values('段康家',2000);
                insert into t_account(name,balance) values('彭依凝',2000);
                

                1.4、定义Bean

                // 定义实体
                public class Account {
                    
                    private Integer id;
                    
                    private String name;
                    
                    private Integer balance;
                }
                
                // 业务接口
                public interface AccountService {
                    public void transfer(Integer srcId,Integer destId,Integer money);
                }
                public class AccountServiceImpl implements AccountService {
                    @Override
                    public void transfer(Integer srcId, Integer destId, Integer money) {
                        // 源账号
                        Account srcAccount = accountDao.selectById(srcId);
                        Integer srcBalance = srcAccount.getBalance();
                        srcAccount.setBalance(srcBalance - money);
                        
                        accountDao.updateById(srcAccount);
                        
                        // 目标账号
                        Account destAccount = accountDao.selectById(destId);
                        Integer destBalance = destAccount.getBalance();
                        destAccount.setBalance(destBalance + money);
                        
                        accountDao.updateById(destAccount);
                    }
                }
                
                // dao接口
                public interface AccountDao {
                    
                    public Account selectById(Integer id);
                    
                    public void updateById(Account account);
                    
                }
                // dao实现类
                public class AccountDaoImpl implements AccountDao {
                    @Override
                    public Account selectById(Integer id) {
                        String sql = "select id,name,balance from t_account where id = ?";
                        List accounts = getJdbcTemplate().query(sql,new BeanPropertyRowMapper(Account.class),id);
                        return accounts.get(0);
                    }
                    @Override
                    public void updateById(Account account) {
                        String sql = "update t_account set balance = ? where id = ?";
                        getJdbcTemplate().update(sql,account.getBalance(),account.getId());
                    }
                }
                

                1.5、主配置文件定义

                 
                	
                    
                        
                    
                    
                    
                        
                    
                    
                    
                        
                        
                        
                        
                    
                
                

                1.6、测试

                @Test
                public void testTransfer() throws Exception{
                        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
                        AccountService accountService = (AccountService) ac.getBean("accountService");
                        accountService.transfer(1,2,100);
                }
                

                2、基于xml的声明式事务

                2.1、配置事务管理器

                
                
                        
                
                

                2.2、配置事务的通知

                 
                
                

                2.3、配置AOP

                ​ 重点是配置切入点表达式及事务通知和切入点表达式的关系

                
                
                        
                        
                
                

                2.4、配置事务的属性

                ​ 注意:事务的属性在tx:advice标签的内部。

                isolation:用于指定事务的隔离级别。默认值是DEFAULT,表示使用数据库的默认隔离级别。

                propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。

                read-only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。

                timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。

                rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。

                no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚。

                
                
                   
                   
                        
                   
                
                

                3、基于注解的声明式事务

                3.1、配置事务管理器

                
                
                        
                
                

                3.2、在业务类添加注解

                @Service("accountService")
                public class AccountServiceImpl implements AccountService {
                    @Autowired
                    private AccountDao accountDao;
                

                3.3、配置JdbcTemplate模板

                
                    
                
                

                3.4、在Dao类添加注解

                @Repository("accountDao")
                public class AccountDaoImpl implements AccountDao {
                    @Autowired
                    private JdbcTemplate jdbcTemplate;
                }
                

                3.5、配置类中扫描包

                
                

                3.6、开启spring对注解事务的支持

                
                

                3.7、在业务层@Transactional注解

                @Service("accountService")
                @Transactional
                public class AccountServiceImpl implements AccountService {
                    @Autowired
                    private AccountDao accountDao;
                }
                

                3.8、测试

                @Test
                public void testTransfer() throws Exception{
                        ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
                        AccountService accountService = (AccountService) ac.getBean("accountService");
                        accountService.transfer(1,2,100);
                }
                

                【Spring进阶系列丨最终篇】一文详解Spring中的事务控制,在这里插入图片描述,第3张