声明式事务

加入jar包:

  com.springsource.net.sf.cglib-2.2.0.jar
  com.springsource.org.aopalliance-1.0.0.jar
  com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
  commons-logging-1.1.3.jar

  spring-aop-4.0.0.RELEASE.jar
  spring-aspects-4.0.0.RELEASE.jar
  spring-beans-4.0.0.RELEASE.jar
  spring-context-4.0.0.RELEASE.jar
  spring-core-4.0.0.RELEASE.jar
  spring-expression-4.0.0.RELEASE.jar

  spring-jdbc-4.0.0.RELEASE.jar
  spring-orm-4.0.0.RELEASE.jar
  spring-tx-4.0.0.RELEASE.jar

  然后是mysql驱动包即C3P0的jar包:
  c3p0-0.9.1.2.jar
  mysql-connector-java-5.1.37-bin.jar

在src目录下创建一个jdbc.properties文件 

  jdbc.user=root
  jdbc.passowrd=123456
  jdbc.url=jdbc:mysql://localhost:3306/tx
  jdbc.driver=com.mysql.jdbc.Driver

在Spring配置文件中配置数据源:

<!-- 引入外部属性文件 -->
            <context:property-placeholder location="classpath:jdbc.properties"/>
            <!-- 配置数据源 -->
            <bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <property name="user" value="${jdbc.user}"></property>
                <property name="password" value="${jdbc.passowrd}"></property>
                <property name="jdbcUrl" value="${jdbc.url}"></property>
                <property name="driverClass" value="${jdbc.driver}"></property>
            </bean>

在Spring配置文件中配置JdbcTemplate

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
                <property name="dataSource" ref="comboPooledDataSource"></property>
            </bean>

在Spring配置文件中配置扫描的包

<context:component-scan base-package="com.neuedu"></context:component-scan>

创建Dao层的包:

@Repository
            public class BookDao {
                @Autowired
                private JdbcTemplate  jdbcTemplate;
                /**
                 *  [1]根据isbn的值查询书的价格
                    [2]根据isbn的值减少书的库存,假设每次都只买1本书
                    [3]根据用户名减少用户账户中的余额,减少的额度就是书的价格
                 */

                public int findPriceByIsbn(String isbn){
                    String sql = "SELECT price FROM book WHERE isbn = ?";
                    Integer price = jdbcTemplate.queryForObject(sql, Integer.class, isbn);
                    return price;
                }
            }
//[2]根据isbn的值减少书的库存,假设每次都只买1本书public void updateStockByIsbn(String isbn){
                    String sql = "UPDATE book_stock SET stock = stock -1 WHERE isbn = ?";
                    jdbcTemplate.update(sql, isbn);
                }
          继续测试:
              public class TestDataSource {
                    private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
                    private BookDao bean = ioc.getBean(BookDao.class);

                    @Test
                    public void test02() throws SQLException {
                        bean.updateStockByIsbn("ISBN-004");
                    }
              }

[3]根据用户名减少用户账户中的余额,减少的额度就是书的价格

public void updateBalance(String userName,int price){
                    String sql = "UPDATE account SET balance = balance - ? WHERE username = ?";
                    jdbcTemplate.update(sql, price,userName);
                }

创建service层:

@Service
            public class BookService {
                @Autowired
                private BookDao bookDao;

                public void doCash(String isbn,String username){
                    int price = bookDao.findPriceByIsbn(isbn);
                    bookDao.updateStockByIsbn(isbn);
                    bookDao.updateBalance(username, price);
                }
            }

测试:

public class TestDataSource {
                private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
                private BookDao bean = ioc.getBean(BookDao.class);
                private BookService bookService  = ioc.getBean(BookService.class);

                @Test
                public void test04() throws SQLException {
                    bookService.doCash("ISBN-001","Tom");
                }
           }

开启事务:

              <!-- 配置事务管理器,并为事务管理器配置数据源!-->
            <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                <property name="dataSource" ref="comboPooledDataSource"></property>
            </bean>
            <!-- 开启基于注解的声明式事务功能,需要设置transaction-manager属性-->
            <!-- 如果 事务管理器的id正好是transaction-manager的默认值transactionManager,则可以省略-->
            <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>        <!--然后在service层的doCash方法上加上:@Transactional注解这样就开启了事务!需要注意的是事务一般是加在service层的!-->
时间: 2024-10-13 02:33:48

声明式事务的相关文章

注解方式实现声明式事务管理

使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制的地方,写上: @Transactional @Transactional注解: 1)应用事务的注解 2)定义到方法上: 当前方法应用spring的声明式事务 3)定义到类上:   当前类的所有的方法都应用Spring声明式事务管理; 4)定义到父类上: 当执行父类的方法时候应用事务. 修改bean

spring4声明式事务--01注解方式

1.在spring配置文件中引入 tx 命名空间 xmlns:tx="http://www.springframework.org/schema/tx" 2.配置事务管理器 <!-- 配置事物管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <p

spring4声明式事务—02 xml配置方式

1.配置普通的 controller,service ,dao 的bean. <!-- 配置 dao ,service --> <bean id="bookShopDao" class="com.liujl.spring.tx.xml.BookShopDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"></propert

spring声明式事务配置详解

spring声明式事务配置详解 君子不器 2013年06月16日 编程世界 5273次阅读 查看评论 理解Spring的声明式事务管理实现 本节的目的是消除与使用声明式事务管理有关的神秘性.简单点儿总是好的,这份参考文档只是告诉你给你的类加上@Transactional注解,在配置文件中添加('<tx:annotation-driven/>')行,然后期望你理解整个过程是怎么工作的.此节讲述Spring的声明式事务管理内部的工作机制,以帮助你在面对事务相关的问题时不至于误入迷途,回朔到上游平静

spring的声明式事务

事务的传播特性 在我们用SSH开发项目的时候,我们一般都是将事务设置在Service层那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事务层里面调用的这些方法要么全部成功,要么全部失败.那么事务的传播特性也是从这里说起的.如果你在你的Service层的这个方法中,除了调用了Dao层的方法之外,还调用了本类的其他的Service方法,那么在调用其他的Service方法的时候,这个事务是怎么规定的呢,我必须保证我在我方法里掉用

Spring声明式事务管理(基于注解方式实现)

----------------------siwuxie095 Spring 声明式事务管理(基于注解方式实现) 以转账为例 1.导入相关 jar 包(共 10 个包) (1)导入核心 jar 包和日志相关的 jar 包 (2)导入 JdbcTemplate 的 jar 包 (3)导入 MySQL 的 JDBC 驱动包 mysql-connector-java 下载链接: https://dev.mysql.com/downloads/connector/j/ (4)导入 AOP 的 jar

spring 声明式事务管理

简单理解事务: 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了1000块但是ATM出钱失败的话,你将会损失1000元:如果银行卡扣钱失败但是ATM却出了1000块,那么银行将损失1000元.所以,如果一个步骤成功另一个步骤失败对双方都不是好事,如果不管哪一个步骤失败了以后,整个取钱过程都能回滚,也就是完全取消所有操作的话,这对双方都是极好的. 当这两个步骤提交了,执行完毕

spring aop 声明式事务管理

Spring使用AOP来完成声明式的事务管理   有annotation和xml两种形式 代码和上一篇基本相近,再贴一遍 两个实体类 package com.ouc.wkp.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity(name = "t_log") public class Log { priva

spring笔记--事务管理之声明式事务

事务简介: 事务管理是企业级应用开发中必不可少的技术,主要用来确保数据的完整性和一致性, 事务:就是一系列动作,它们被当作一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. Spring中使用事务: 作为一个受欢迎的企业应用框架,Spring在不同的事务管理API上定义了一个抽象层,而开发时不必了解底层的事务管理API,就可以使用Spring的事务管理机制. Spring既支持编程式的事务管理,也支持声明式的事务管理,大多数情况我们选择后者. 编程式事务管理:将事务管理代码嵌入到业务代