首页 > 技术文章 > Spring-事务管理(概念和环境搭建)

orzjiangxiaoyu 2020-08-19 10:55 原文

1.什么是事务?

(1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败

(2)典型场景:银行转账

2.事务特性(ACID)

(1)原子性:要么都执行,要么都不执行

(2)一致性:操作前后总量不变

(3)隔离性:

(4)持久性:

 

3.搭建事务操作基本环境

(1)银行转账例子环境

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

 

 

 

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

(1)service注入dao,在dao注入JdbcTemplate,在JdbcTemplate注入dataSource

package com.orzjiangxiaoyu.spring.service;

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

/**
 * @author orz
 * @create 2020-08-18 16:32
 */
@Service
public class BankService {
    
    @Autowired
    private BankDao bankDao;
    
    
}
package com.orzjiangxiaoyu.spring.dao;

/**
 * @author orz
 * @create 2020-08-18 16:32
 */

public interface BankDao {

}
package com.orzjiangxiaoyu.spring.dao;

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

/**
 * @author orz
 * @create 2020-08-18 16:32
 */
@Repository
public class BankDaoImpl implements BankDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

}

(2)在dao里面创建两个方法:少钱方法、多钱方法

package com.orzjiangxiaoyu.spring.dao;

/**
 * @author orz
 * @create 2020-08-18 16:32
 */

public interface BankDao {

    public void addMoney();
    public void reduceMoney();
}
package com.orzjiangxiaoyu.spring.dao;

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

/**
 * @author orz
 * @create 2020-08-18 16:32
 */
@Repository
public class BankDaoImpl implements BankDao {

    //AA转账100给BB

    @Autowired
    private JdbcTemplate jdbcTemplate;

    //多钱的方法
    //BB+100

    @Override
    public void addMoney() {
        String sql="update user_table set balance=balance+? where user=?";
        int update = jdbcTemplate.update(sql, 100, "BB");
        System.out.println(update);

    }

    //少钱的方法
    //AA-100

    @Override
    public void reduceMoney() {

        String sql="update user_table set balance=balance-? where user=?";
        int update = jdbcTemplate.update(sql, 100, "AA");
        System.out.println(update);
    }
}

(3)在service里面创建转账方法

package com.orzjiangxiaoyu.spring.service;

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

/**
 * @author orz
 * @create 2020-08-18 16:32
 */
@Service
public class BankService {

    @Autowired
    private BankDao bankDao;
    
    //转账方法
    public void accountMoney()
    {
        //AA减100
        bankDao.reduceMoney();
        //BB加100
        bankDao.addMoney();
        
    }


}

(5)测试

package com.orzjiangxiaoyu.spring.testdemo;

import com.orzjiangxiaoyu.spring.service.BankService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author orz
 * @create 2020-08-18 16:49
 */
public class Test1 {
    @Test
    public void test1()
    {
        ApplicationContext context=new ClassPathXmlApplicationContext("jdbcbean.xml");
        BankService bankService = context.getBean("bankService", BankService.class);
        bankService.accountMoney();
    }
}

上面代码如果正常执行没有问题的,但是如果代码出现异常则会出现问题

使用事务进行解决

推荐阅读