注解实现的spring事务
2021-06-27 14:07
标签:div nbsp enc led else timeout tst 调用 库存 接口 注解事务 接口 实现类 测试类 配置文件 注解实现的spring事务 标签:div nbsp enc led else timeout tst 调用 库存 原文地址:https://www.cnblogs.com/kill-9/p/9651771.html 1 package spring.transaction;
2
3 public interface BookDao {
4
5 //根据书名获取书的单价
6 double findBookPriceByName(String bookName);
7
8 //更新库存数
9 void updateBookStock(String bookName);
10
11 //更新买家账户金额
12 void updateBuyerAmount(String buyerName,double price);
13
14 //更新卖家账户金额
15 void updateSellerAmount(String sellerName,double price);
16
17 }
jdbcTemplate操作mysql
1 package spring.transaction;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.jdbc.core.JdbcTemplate;
5 import org.springframework.stereotype.Repository;
6
7
8 @Repository(value = "BookDao")
9 public class BookDaoImpl implements BookDao {
10
11 @Autowired
12 private JdbcTemplate jdbcTemplate;
13
14
15 @Override
16 public double findBookPriceByName(String bookName) {
17 String sql = "SELECT `price` FROM `book` WHERE `name`=?";
18 return jdbcTemplate.queryForObject(sql,double.class,bookName);
19 }
20
21 @Override
22 public void updateBookStock(String bookName) {
23 String check = "SELECT `stock` FROM `book` WHERE `name`=?";
24 int result = jdbcTemplate.queryForObject(check,int.class,bookName);
25
26 if (result>0){
27 String sql = "UPDATE `book` SET `stock`= `stock`-1 WHERE `name`=?";
28 jdbcTemplate.update(sql,bookName);
29 }else {
30 throw new RuntimeException("库存不足!");
31 }
32
33
34 }
35
36 @Override
37 public void updateBuyerAmount(String buyerName, double price) {
38 String check = "SELECT `amount` FROM `buyer` WHERE `name`=?";
39 double result = jdbcTemplate.queryForObject(check,double.class,buyerName);
40 if(result>price){
41 String sql = "UPDATE `buyer` SET `amount`= `amount`-? WHERE `name`=?";
42 jdbcTemplate.update(sql,price,buyerName);
43 }else {
44 throw new RuntimeException("余额不足!");
45 }
46
47 }
48
49 @Override
50 public void updateSellerAmount(String sellerName, double price) {
51 String sql = "UPDATE `seller` SET `amount`= `amount`+? WHERE `name`=?";
52 jdbcTemplate.update(sql,price,sellerName);
53
54 }
55 }
1 package spring.transaction;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.beans.factory.annotation.Qualifier;
5 import org.springframework.stereotype.Service;
6 import org.springframework.transaction.annotation.Isolation;
7 import org.springframework.transaction.annotation.Propagation;
8 import org.springframework.transaction.annotation.Transactional;
9
10 @Service(value = "BookService")
11 public class BookService {
12
13 @Autowired @Qualifier(value = "BookDao")
14 private BookDao dao;
15
16 /**
17 * 买书的交易过程方法
18 * @param bookName 书名
19 * @param buyerName 买家名
20 * @param sellerName 卖家名
21 *
22 */
23
24 /*
25 * 事务
26 * - propagation 指定事务的传播行为
27 * - 定义当前事务方法被另外一个事务方法调用是时,如何使用事务
28 * - 默认是REQUIRED,也就是使用调用方法的事务
29 * -REQUIRES_NEW 使用新事务
30 *
31 * - isolation 指定事务的隔离级别
32 * - 常用级别 READ_COMMITTED
33 *
34 * - rollbackFor/noRollbackFor 定义要(不)执行回滚的异常
35 *
36 * - readOnly 指定事务是否只读
37 *
38 * - timeout 指定强制回滚之前事务可以占用的时间,单位是秒
39 */
40 @Transactional(propagation = Propagation.REQUIRES_NEW,
41 isolation = Isolation.READ_COMMITTED,
42 rollbackFor = Exception.class,
43 readOnly = false,
44 timeout = 3)
45 public void action(String buyerName,String sellerName,String bookName) {//
46
47 // 超时导致的事务强制回滚
48 // try {
49 // Thread.sleep(5000);
50 // } catch (InterruptedException e) {
51 // e.printStackTrace();
52 // }
53 //获得单价
54 double price = dao.findBookPriceByName(bookName);
55
56 //更新库存
57 dao.updateBookStock(bookName);
58
59 //买家付款
60 dao.updateBuyerAmount(buyerName,price);
61
62 //卖家收款
63 dao.updateSellerAmount(sellerName,price);
64 }
65
66
67 }
1 package spring.transaction;
2
6 public interface MulBookDao {
7 void mulAction( String buyerName, String sellerName,String... bookNameList);
8 }
1 package spring.transaction;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.stereotype.Service;
5 import org.springframework.transaction.annotation.Transactional;
6
7
8
9 @Service("service")
10 public class MulBookDaoImpl implements MulBookDao {
11
12 @Autowired
13 private BookService bookService;
14
15
16 //购买多本数
17 @Transactional
18 @Override
19 public void mulAction(String buyerName, String sellerName,String... bookNameList) {
20
21 for (String bookName : bookNameList){
22 bookService.action(buyerName,sellerName,bookName);
23 }
24 }
25 }
1 package spring.transaction;
2
3 import org.junit.Before;
4 import org.junit.Test;
5 import org.springframework.context.ApplicationContext;
6 import org.springframework.context.support.ClassPathXmlApplicationContext;
7
8 public class TransactionTest {
9
10 private ApplicationContext ac;
11 private MulBookDaoImpl service;
12
13 @Before
14 public void init(){
15 ac = new ClassPathXmlApplicationContext("classpath:transaction.xml");
16 service = ac.getBean("service",MulBookDaoImpl.class);
17 }
18
19
20 @Test
21 public void test(){
22
23 service.mulAction("Tom","LK","JAVA","C");
24 }
25 }
1 xml version="1.0" encoding="UTF-8"?>
2 beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:p="http://www.springframework.org/schema/p"
5 xmlns:context="http://www.springframework.org/schema/context"
6 xmlns:aop="http://www.springframework.org/schema/aop"
7 xmlns:util="http://www.springframework.org/schema/util"
8 xmlns:tx="http://www.springframework.org/schema/tx"
9 xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
10 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
11 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
12 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
13 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
14
15
16 context:component-scan base-package="spring.transaction"/>
17
18
19 aop:aspectj-autoproxy proxy-target-class="true" />
20
21
22
23 util:properties location="classpath:db.properties" local-override="true" id="db"/>
24
25 bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
26 property name="driverClass" value="#{db.driverClass}"/>
27 property name="jdbcUrl" value="#{db.jdbcUrl}"/>
28 property name="user" value="#{db.user}"/>
29 property name="password" value="#{db.password}"/>
30
31 property name="initialPoolSize" value="#{db.initialPoolSize}"/>
32 property name="maxPoolSize" value="#{db.maxPoolSize}"/>
33 bean>
34
35
36 bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
37 property name="dataSource" ref="dataSource"/>
38 bean>
39
40
41 bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
42 constructor-arg name="dataSource" value="#{dataSource}"/>
43 bean>
44
45
46 bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
47 property name="dataSource" value="#{dataSource}"/>
48 bean>
49
50
51 tx:annotation-driven transaction-manager="transactionManager" />
52
53
54
55 beans>