Spring_事务管理(转账案例)

实现一个转账的业务:

OrderDao.java:

package h.l.tx;

import org.springframework.jdbc.core.JdbcTemplate;

public class OrderDao {

	private JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	// 模拟转账功能:少钱的方法
	public void desMoney() {
		String sql = "update account set balance=balance-? where username=?";
		jdbcTemplate.update(sql, 1000, "zs");
	}
	// 模拟转账功能:多钱的方法
	public void incMoney() {
		String sql = "update account set balance=balance+? where username=?";
		jdbcTemplate.update(sql, 1000, "ls");
	}
}

OrderService.java:

package h.l.tx;

public class OrderService {

	private OrderDao orderDao;

	public void setOrderDao(OrderDao orderDao) {
		this.orderDao = orderDao;
	}

	// 业务逻辑:转账功能
	public void accountMoney() {
		// 甲少钱
		orderDao.desMoney();
		//手动添加异常
		int i=1/0;
		// 乙多钱
		orderDao.incMoney();
	}
}

Spring配置文件:ApplicationContext.xml文件:


 

	
	
		
		
		
		
		
	

	
	
		
	
	
		
	
	
	
	
		
	

测试程序:

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

class OrderServiceTest {

	ApplicationContext context;
	@BeforeEach
	void setUp() throws Exception {
		context = new ClassPathXmlApplicationContext(
				"springConfig/ApplicationContext.xml");
	}
	@Test
	void test() {
		OrderService orderService=(OrderService)context.getBean("orderService");
		orderService.accountMoney();
	}

}

执行了上述代码之后,会出现个很严重的问题,就是单元测试没有通过,因为int i=1/0;但是在数据库中zs的钱已经少了1000,,因此解决方法就是加上事务管理:出现异常时,回滚。下面给该功能添加事务功能:

配置文件方式实现:修改上面的ApplicationContext.xml文件即可保证在转账过程中如果出现了异常会进行回滚。



		
	
	
		
		
		
		
		
	
	
	
	
		
		
	
	
	
		
		
			
			
		
	
	
	
		
		
		
	
	
	
	
		
	
	
		
	

	
	
		
	

注解方式实现:

第一步:修改ApplicationContext.xml文件:



		
	
	
		
		
		
		
		
	
	
	
	
		
		
	
	
	
	
	
	
		
	
	
		
	

	
	
		
	

第二步在需要添加事务功能的类上加上@Transactional注解:如下即可:

package h.l.tx;

import org.springframework.transaction.annotation.Transactional;

@Transactional
public class OrderService {

	private OrderDao orderDao;

	public void setOrderDao(OrderDao orderDao) {
		this.orderDao = orderDao;
	}

	// 业务逻辑:转账功能
	public void accountMoney() {
		// 甲少钱
		orderDao.desMoney();
		//出现异常
		int i=1/0;
		// 乙多钱
		orderDao.incMoney();
	}
}

注:以上文章仅是个人学习过程总结,若有不当之处,望不吝赐教

你可能感兴趣的:(JavaWeb)