18.Spring_声明式事务

本文介绍了一个基于Spring框架的图书购买业务模拟系统,该系统通过事务处理确保库存和账户余额的一致性。具体包括:获取图书单价、更新库存及账户余额等步骤,并详细展示了如何使用@Transactional注解来保证操作的原子性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库中book、book_stock、account三个表中模拟购买图书业务。若库存或账户余额不满足要求则事务不能进行。

service方法:

对应三步,获取图书单价,更新库存(库存减一),更新余额(balance-price)

在需要进行事务处理的函数上方添加@Transactional注解,使得三个步奏成为一个事务。


@Service("bookShopService")
public class BookShopServiceImpl implements BookShopService {
	@Autowired
	private BookShopDao bookShopDao;
	
	@Transactional//添加事务注解
	@Override
	public void purchase(String username, String isbn) {
		//1.获取书单价
		int price=bookShopDao.findBookPriceByIsbn(isbn);
		//2.更新书库存
		bookShopDao.updateBookStock(isbn);
		//3.更新用户余额
		bookShopDao.updateUserAccount(username, price);
	}

}

DAO的实现类:

package com.hcx.spring.tx;

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

@Repository("bookShopImpl")
public class BookShopImpl implements BookShopDao{
	@Autowired
	private JdbcTemplate jdbcTemplate; 
	
	@Override
	public int findBookPriceByIsbn(String isbn) {
		String sql = "select price from book where isbn = ?";
		return jdbcTemplate.queryForObject(sql, Integer.class,isbn);
	}

	@Override
	public void updateBookStock(String isbn) {
		//检查书的库存是否足够,不够抛出异常
				String sql2="select stock from book_stock where isbn=?"; 
				int stock=jdbcTemplate.queryForObject(sql2, Integer.class,isbn);
				if (stock==0) {
					throw new BookStockException("库存不足");
				}
		String sql = "update book_stock set stock=stock-1 where isbn =?";
		jdbcTemplate.update(sql,isbn);
	}

	@Override
	public void updateUserAccount(String username, int price) {
		String sql2="select balance from account where username=?"; 
		int balance=jdbcTemplate.queryForObject(sql2, Integer.class,username);
		if (balance<price) {
			throw new UserAccountException("余额不足");
		}
		
		
		String sql = "update account set balance=balance - ? where username=?";
		jdbcTemplate.update(sql, price,username);
	}

}

Spring配置文件:

1.配置事务管理器

2.启用事务注解

<?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:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 使用注解方式 -->
	<context:component-scan base-package="com.hcx.spring"></context:component-scan>
<!-- 导入资源文件 -->
	<context:property-placeholder  location="classpath:db.properties" />

<!-- 配置c3p0 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		
		<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
		<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
	</bean>
	
	<!-- 配置JdbcTemplate  -->
	<bean id="jdbcTemplate" 
		class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	
	<!-- 配置 NamedParameterJdbcTemplate 对象,该对象可以使用具名参数,其没有无参构造器,所以必须传递参数-->
	<bean id="NamedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
		<constructor-arg ref="dataSource"></constructor-arg>
	 </bean>
	 
	<!-- 配置事务管理器 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 启用事务注解 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值