Spring事务演示案例

一、环境搭建

1)、数据库

新建users表

Spring事务演示案例_第1张图片

2)、创建maven项目 

Spring事务演示案例_第2张图片

pom需要引入的包:


        
            org.springframework
            spring-core
            3.0.6.RELEASE
        
        
            org.springframework
            spring-context
            3.0.6.RELEASE
        
        
            org.springframework
            spring-aop
            3.0.6.RELEASE
        
        
            org.springframework
            spring-orm
            3.0.6.RELEASE
        
        
            org.aspectj
            aspectjrt
            1.6.1
        
        
            aspectj
            aspectjweaver
            1.5.3
        
        
            cglib
            cglib
            2.1_2
        
        
        
            com.mchange
            c3p0
            0.9.5.2
        
        
        
            mysql
            mysql-connector-java
            5.1.37
        

配置文件内容:



    
    
    
    
        
        
        
        
    
    
    
        
    
    
    
        
    
    
    

dao层:

@Repository
public class UsersDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void addUser(String name,Integer age) {
        String sql="INSERT INTO users(name, age) VALUES(?, ?);";
        jdbcTemplate.update(sql, name,age);
        System.out.println("添加数据成功!.......");
    }
}

service层:

@Service
public class UsersService {

    @Autowired
    private UsersDao usersDao;

    public void add(){
        usersDao.addUser("吴大宝01",18);
        int i=1/0;//故意制造异常
        usersDao.addUser("吴大宝02",20);
        System.out.println("添加用户成功!");
    }
}

项目启动类app:

public class App {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("transaction.xml");
        UsersService usersService = (UsersService) applicationContext.getBean("usersService");
        usersService.add();
    }
}

 二、事务演示

想要的效果:“吴大宝01”和“吴大宝02”要么都成功要么都失败

1)、首次启动未添加事务时

Spring事务演示案例_第3张图片

Spring事务演示案例_第4张图片

只有“吴大宝01”添加成功了

2)、方式一:手工添加事务

自定义事务管理类

/**
 * @program: TransactionDemo
 * @description:
 * @author: hq.zheng
 * @create: 2019-08-04 13:02
 */
@Component
public class TransactionManager {
    @Autowired
    private DataSourceTransactionManager manager;

    /**
     * 开启事务
     */
    public TransactionStatus begin(){
        //获取事务状态
        TransactionStatus transaction = manager.getTransaction(new DefaultTransactionAttribute());
        return transaction;
    }

    /**
     * 提交事务
     * @param transaction
     */
    public void commit(TransactionStatus transaction){
        //提交到数据库
        manager.commit(transaction);
    }

    /**
     * 回滚事务
     * @param transaction
     */
    public void rollback(TransactionStatus transaction){
        manager.rollback(transaction);
    }
}

修改service类添加手工事务

@Service
public class UsersService {

    @Autowired
    private UsersDao usersDao;

    @Autowired
    private TransactionManager manager;

    public void add(){
        TransactionStatus begin=null;
        try {
            //开启事务
            begin = manager.begin();

            usersDao.addUser("吴大宝01",18);
            int i=1/0;//故意制造异常
            usersDao.addUser("吴大宝02",20);
            System.out.println("添加用户成功!");

            //提交事务
            manager.commit(begin);
        } catch (Exception e) {
            e.printStackTrace();
            //发生异常回滚事务
            manager.rollback(begin);
            System.out.println("发生异常回滚事务!");
        } finally {
        }
    }
}

运行结果

Spring事务演示案例_第5张图片

Spring事务演示案例_第6张图片

 添加事务成功了,发生异常时“吴大宝01”和“吴大宝02”添加都没有添加成功

去掉异常再测试

Spring事务演示案例_第7张图片

运行结果

Spring事务演示案例_第8张图片

Spring事务演示案例_第9张图片  

“吴大宝01”和“吴大宝02”同时添加成功 

3)、方式二:自动添加事务(XML形式) 

配置文件中添加事务增强

   
    
        
            
            
            
        
    
    
    
        
        
    

注意:如果手工try catch了将不执行回滚,有异常外抛才会执行,可以再catch里面加上手动回滚

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

4)、方式三:自动添加事务(注解形式) 

开启注解事务


应用事务,在需要的方法上加@Transactional

    @Transactional
    public void add() {

        usersDao.addUser("吴大宝01", 18);
        int i=1/0;//故意制造异常
        usersDao.addUser("吴大宝02", 20);
        System.out.println("添加用户成功!");

    }

 

 

你可能感兴趣的:(菜鸟JAVA之旅)