注解实现的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>

原文地址:https://www.cnblogs.com/kill-9/p/9651771.html

时间: 2024-12-23 20:01:55

注解实现的spring事务的相关文章

spring 事务管理详解 学习心得

今天,我终于登上了你的诺曼底,spring事务. 在此之前,一谈起spring我就没底,虽然用的很顺手,但是其中的AOP和事务一直未理解和掌握,数次尝试突破都未成功,之前看过很多网上的相关文章和书籍,要么基于的版本不同,有的基于spring2有的基于spring3:要么切入点不同,有的讲的太低级,我都懂,有的讲的太庞杂,我晕了...... 从这周一开始,我决定在试一下.计划每天的上午专门学习,横扫各大网站,收集文章,然后对其分类,整理记笔记,到周二坚持一个一个的看,规整,理解,熟记,本子下写下了

Spring事务管理,使用@Transactional注解

1.导入所需jar包(Spring3.0之后不再一起发布依赖包,要自行下载) 2.在applicationContext.xml配置文件加入以下属性 <!-- spring 事务配置管理,Hibernate单数据源事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <pro

Spring事务管理-使用注解配置事务

一.概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用 提供比其他事务API如JTA更简单的编程式事务管理

Spring事务注解

使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间 <beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:tx="http://www.springframework.org/schema/tx"  xsi:schemaLoca

spring 事务注解

Spring事务传播行为类型 事务传播行为类型 说明 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.这是最常见的选择. PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行. PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常. PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起. PROPAGATION_

Spring使用注解方式就行事务管理

使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation

框架 day37 Spring事务管理,整合web,SSH整合,SSH整合注解

1     事务管理 1.1   回顾事务     事务:一组业务操作,要么全部成功,要么全部不成功.     事务特性:ACID 原子性:整体 一致性:数据(完整) 隔离性:并发(多个事务) 持久性:结果     隔离问题:脏读.不可重复读.幻读(虚读)     隔离级别:4个 readuncommitted 读未提交,存在3个问题. readcommitted 读已提交,解决:脏读:存在2个. repeatableread 可重复读,解决:脏读.不可重复读:存在1个 serializ

Spring事务配置方式(一) 注解方式配置

注解方式配置事务 引用自 http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="d

手动实现自己的spring事务注解

spring事务是基于同一个数据连接来实现的,认识到这一点是spring事务的关键,spring事务的关键点便在于在事务中不管执行几次db操作,始终使用的是同一个数据库连接.通过查看源码,我们可以看到spring事务实现思路如下 这其中的关键点就在于如何保证在事务内获取的数据库连接为同一个以及通过aop来代理数据库连接的提交.回滚.代码如下 构建自己的事务管理器,使用threadlocal来保证一个线程内获取到的数据库连接为同一个 package com.jlwj.custom; import