Spring_事务操作:搭建事务操作环境及事务场景引入

搭建事务操作环境

例:银行转账环境

银行转账(a转账给b,100元,a少100元,b多100元)

1.创建数据库表,添加记录

2.创建service,搭建dao,完成对象创建和注入关系

3.在Dao创建两个方法:多钱和少钱方法,在service创建方法(转账的方法).

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--开启组件扫描-->
    <context:component-scan base-package="com.tinstu.spring"></context:component-scan>
    <!--配置数据库-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/bookjdbc?serverTimezone=UTC"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
    <!--JdbcTemplate对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--注入dataSource-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
 </beans>

BankService.java

package com.tinstu.spring.service;

import com.tinstu.spring.dao.BankDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BankService {
    //注入dao
    @Autowired
    private BankDao bankDao;
    //转账方法
    public void accountMoney(){
        //a少一百
        bankDao.reduceMoney();
        //b多一百
        bankDao.addMoney();
    }

}

接口:BankDao.java

package com.tinstu.spring.dao;

public interface BankDao {
    //多钱
    public void addMoney();
    //少钱
    public void reduceMoney();
}

BankDaoImpl.java

package com.tinstu.spring.dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class BankDaoImpl implements BankDao{
    @Autowired
    private JdbcTemplate jdbcTemplate;

    //a给b转账100元
    @Override
    public void reduceMoney() {
        String sql = "update bank set money=money-? where username=?";
        jdbcTemplate.update(sql,100,"a");
    }

    @Override
    public void addMoney() {
        String sql = "update bank set money=money+? where username=?";
        jdbcTemplate.update(sql,100,"b");
    }
}

test.java

import com.tinstu.spring.service.BankService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
    @Test
    public void testjdbcpl(){
        //加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        //获取配置创建对象
        BankService bankService= context.getBean("bankService", BankService.class);
        bankService.accountMoney();
    }
}

事务场景引入

上面的代码,如果能正常执行没有任何问题,但是如果代码执行过程中出现异常

    public void accountMoney(){
        //a少一百
        bankDao.reduceMoney();
        //模拟异常
        int i= 10/0;
        //b多一百
        bankDao.addMoney();
    }

执行后,a少了100,但是b没有增加100.

如何解决?

使用事务进行解决!

Spring_事务操作:Spring声明式事务管理1(注解方式/参数配置)

 public void accountMoney(){
        try{
            //第一步:开启事务
            //第二步:进行业务操作
            //a少一百
            bankDao.reduceMoney();
            //模拟异常
            int i= 10/0;
            //b多一百
            bankDao.addMoney();
            //第三步:如果没有异常,提交事务
            
        }catch(Exception e){
            //出现异常 事务回滚
        }
        
    }

 

阅读剩余
THE END