注解实现的spring事务

Posted kill-9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注解实现的spring事务相关的知识,希望对你有一定的参考价值。

接口

 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 <!--配置C3P0数据源--> 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 <!--配置jdbcTemplate的Bean--> 36 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 37 <property name="dataSource" ref="dataSource"/> 38 </bean> 39 40 <!--具名jdbc模版Bean--> 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>

 

以上是关于注解实现的spring事务的主要内容,如果未能解决你的问题,请参考以下文章

spring事务实现原理

Java开发Spring之AOP详解(xml--注解->方法增强事务管理(声明事务的实现))

Spring Aop基于注解的实现

使用Spring配置文件实现事务管理

spring 声明式事务的坑 @Transactional 注解

面试官:@Transactional 注解是如何实现的?