注解的形式与xml文件的形式完成事务管理及xml文件的配置
需要的jar包:
c3p0-0.9.2.1.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
mchange-commons-java-0.2.3.4.jar
mysql-connector-java-5.0.8-bin.jar
spring-aop-4.2.2.RELEASE.jar
spring-beans-4.2.2.RELEASE.jar
spring-context-4.2.2.RELEASE.jar
spring-core-4.2.2.RELEASE.jar
spring-expression-4.2.2.RELEASE.jar
spring-jdbc-4.2.2.RELEASE.jar
spring-tx-4.2.2.RELEASE.jar
1.注解方式的XML文件配置:
<?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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 包扫描 -->
<context:component-scan base-package="com.eduask.liusheng"/> <!-- 引入属性文件 -->
<context:property-placeholder location="db.properties"/> <!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean> <!-- 配置jdbcTemplate模版 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 开启事务管理驱动 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
public interface BookShopDao {
/**
* 根据isbn查找单价
* @param isbn 编号
* @return
*/
public int findBookPriceByIsbn(String isbn); /**
* 修改库存
* @param isbn 编号
*/
public void updateBookStock(String isbn); /**
* 修改账户余额
* @param username 用户名
* @param price 价格
*/
public void updateAccount(String username,int price); }
BookShopDao.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository; @Repository("bookShopDao")
public class BookShopDaoImp implements BookShopDao {
@Autowired
private JdbcTemplate jdbcTemplate; public int findBookPriceByIsbn(String isbn) {
String sql="select price from book where isbn=?";
int price=jdbcTemplate.queryForObject(sql, Integer.class, isbn);
return price;
} public void updateBookStock(String isbn) {
String sql="select stock from book_stock where isbn=?";
int stock=jdbcTemplate.queryForObject(sql, Integer.class, isbn);
if (stock>0) {
sql="update book_stock set stock=stock-1 where isbn=?";
jdbcTemplate.update(sql, isbn);
} else {
throw new RuntimeException("库存不足!");
}
} @Override
public void updateAccount(String username, int price) {
String sql="select balance from account where username=?";
int balance=jdbcTemplate.queryForObject(sql, Integer.class, username);
if (balance>=price) {
sql="update account set balance=balance-? where username=?";
jdbcTemplate.update(sql, price,username);
} else {
throw new RuntimeException("余额不足!");
}
} }
BookShopDaoImp.java
public interface BookShopService {
/**
* 购买功能
* @param username 用户名
* @param isbn 书编号
*/
public void purchase(String username,String isbn);
}
BookShopService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import com.eduask.liusheng.dao.BookShopDao;
@Service("bookShopService")
public class BookShopServiceImp implements BookShopService {
@Autowired
private BookShopDao bookShopDao; @Transactional(propagation=Propagation.REQUIRES_NEW,timeout=3)
public void purchase(String username, String isbn) { //1.根据编号查询价格
int price=bookShopDao.findBookPriceByIsbn(isbn); //2.修改库存
bookShopDao.updateBookStock(isbn);
//测试超时
// try {
// Thread.sleep(8000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } //3.修改余额
bookShopDao.updateAccount(username, price); } }
BookShopServiceImp.java
import java.util.List; public interface BookShopCashier {
/**
* 结账
* @param isbns
* @param username
*/
public void checkOut(List<String> isbns,String username);
}
BookShopCashier.java
import java.util.List; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service("bookShopCashier")
public class BookShopCashierImp implements BookShopCashier {
@Autowired
private BookShopService bookShopService; @Transactional
public void checkOut(List<String> isbns, String username){
for (String isbn : isbns) {
bookShopService.purchase(username, isbn);
}
} }
BookShopCashierImp.java
@Transactional(属性)
传播行为propagation 常用REQUIRES_NEW与REQUIRED
隔离事务isolation 默认READ_COMMITTED 拓展并发事务引起的问题,脏读.不可重复度,幻读
rollbackFor 和noRollbackFor 设置回滚与不回滚 默认RunTimeException自动回滚,checked的异常不回滚
timeout 设置超时时间,单位s
2.xml方式的xml文件配置
<?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:aop="http://www.springframework.org/schema/aop"
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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="bookShopDao" class="com.eduask.liusheng.dao.BookShopDaoImp" autowire="byName"/> <bean id="bookShopService" class="com.eduask.liusheng.service.BookShopServiceImp" autowire="byName"/> <bean id="bookShopCashier" class="com.eduask.liusheng.service.BookShopCashierImp" autowire="byName"/> <!-- 引入属性文件 -->
<context:property-placeholder location="db.properties"/> <!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean> <!-- 配置jdbcTemplate模版 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 配置事务通知 -->
<tx:advice id="advice" transaction-manager="transactionManager">
<!--
name 方法名
propagation 传播属性:REQUIRES_NEW,REQUIRED 事务被挂起的时间不计入超时时间
isolation 隔离事务级别 MySQL4种,Oracle2种
timeout 超时时间 :-1永不超时,单位s;防止长期运行的事务占用资源
no-rollback-for 不回滚 (异常名)
rollback-for 回滚
任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚
read-only 只读属性:表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务
-->
<tx:attributes>
<tx:method name="purchase" propagation="REQUIRED" isolation="READ_COMMITTED" />
<tx:method name="checkOut" propagation="REQUIRED" isolation="READ_COMMITTED" timeout="3"/>
<!-- 增删改方法 -->
<tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
<!-- 查询方法只读 -->
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice> <!-- 配置切点 -->
<aop:config>
<!-- 配置切点 -->
<aop:pointcut expression="execution(* com.eduask.liusheng.service.*.*(..))" id="pointcut"/>
<!-- 关联切点与通知 -->
<aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
</aop:config> </beans>
import org.springframework.jdbc.core.JdbcTemplate; public class BookShopDaoImp implements BookShopDao { private JdbcTemplate jdbcTemplate; public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
} public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
} public int findBookPriceByIsbn(String isbn) {
String sql="select price from book where isbn=?";
int price=jdbcTemplate.queryForObject(sql, Integer.class, isbn);
return price;
} public void updateBookStock(String isbn) {
String sql="select stock from book_stock where isbn=?";
int stock=jdbcTemplate.queryForObject(sql, Integer.class, isbn);
if (stock>0) {
sql="update book_stock set stock=stock-1 where isbn=?";
jdbcTemplate.update(sql, isbn);
} else {
throw new RuntimeException("库存不足!");
}
} public void updateAccount(String username, int price) {
String sql="select balance from account where username=?";
int balance=jdbcTemplate.queryForObject(sql, Integer.class, username);
if (balance>=price) {
sql="update account set balance=balance-? where username=?";
jdbcTemplate.update(sql, price,username);
} else {
throw new RuntimeException("余额不足!");
}
} }
BookShopDaoImp.java
import com.eduask.liusheng.dao.BookShopDao; public class BookShopServiceImp implements BookShopService { private BookShopDao bookShopDao; public BookShopDao getBookShopDao() {
return bookShopDao;
} public void setBookShopDao(BookShopDao bookShopDao) {
this.bookShopDao = bookShopDao;
} public void purchase(String username, String isbn) { //1.根据编号查询价格
int price=bookShopDao.findBookPriceByIsbn(isbn); //2.修改库存
bookShopDao.updateBookStock(isbn); try {
Thread.sleep(8000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //3.修改余额
bookShopDao.updateAccount(username, price); } }
BookShopServiceImp.java
import java.util.List; public class BookShopCashierImp implements BookShopCashier { private BookShopService bookShopService; public BookShopService getBookShopService() {
return bookShopService;
} public void setBookShopService(BookShopService bookShopService) {
this.bookShopService = bookShopService;
} public void checkOut(List<String> isbns, String username){
for (String isbn : isbns) {
bookShopService.purchase(username, isbn);
}
} }
BookShopCashierImp.java
注解的形式与xml文件的形式完成事务管理及xml文件的配置的更多相关文章
- 9.Spring整合Hibernate_2_声明式的事务管理(Xml的方式)
使用xml的方式进行声明式的事务管理 推荐使用xml的方式,因为可以同时为多个方法进行声明 <!-- 开启Spring中的事务管理(声明式的事务管理) xml--> <!-- 不管是 ...
- Spring整合hibernate:3、使用XML进行声明式的事务管理
配置applicationContext.xml文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...
- 0045 Spring中使用DataSourceTransactionManager进行事务管理的xml配置
在一个业务的实现过程中,可能需要多条sql完成对数据库的操作,比如账户登录,需要匹配用户名和密码,然后要增加积分,还要记录登录的ip和时间,这可能需要三个sql语句,这三个语句应当是一个整体,任意一个 ...
- Spring中使用DataSourceTransactionManager进行事务管理的xml配置
在一个业务的实现过程中,可能需要多条sql完成对数据库的操作,比如账户登录,需要匹配用户名和密码,然后要增加积分,还要记录登录的ip和时间,这可能需要三个sql语句,这三个语句应当是一个整体,任意一个 ...
- spring事务管理(xml配置)与spring自带连接数据库JdbcTemplate
什么是事务,很通俗的话来说就是,我们日常生活中总会出现在银行转账的业务,加入A向B转账100元,此时A的账户中应该减少100元,B的账户中增加100元,但是如果在A转完账B还没有接受的时候,服务器出现 ...
- sping 对 hibernate进行事务管理--Annotation, xml, 大多数使用XML
1. UserServiceTest.java: package com.bjsxt.service; import org.junit.Test; import org.springframewor ...
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
- Spring事务管理的xml方式
一个业务的成功: 调用的service是执行成功的,意味着service中调用的所有的dao是执行成功的. 事务应该在Service层统一控制. 如果手动去实现,则需要对dao进行代理,在方法前后进 ...
- Hive记录-配置支持事务管理hive-site.xml
<property> <name>hive.support.concurrency</name> <value>true</value> & ...
随机推荐
- Hibernate的注解方法的使用
1.配置映射关系的xml方式 我们知道,Hibernate是一个典型的ORM框架,用以解决对象和关系的不匹配.其思想就是将关系数据库中表的记录映射成为对象,以对象形式展现,这样一来,就可以把对数据库的 ...
- jmeter测试HTTP请求
HTTP超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.(详情参考看一下百科) HTTP发送请求有GE ...
- python入门之一python安装及程序运行
Python 程序要运行,需要先安装python解释器 PVM(这里可对照java的JVM来理解)实际上,你不需要单独安装,直接安装python后就可以了 1.安装python 下载地址:http:/ ...
- ajax跨域问题Access-Control-Allow-Origin
Access control allow origin直译过来就是"访问控制允许同源",这是由于ajax跨域访问引起的.所谓跨域就是,在a.com域下,访问b.com域下的资源:出 ...
- Excel 若某列包含某个字符则特定列显示特定字符
今天在写Excel , 有很多重复的数据, 在想 如果 可以像Java 一样 筛选就好了 这样的效果 if ("adj".equals(sheet1.A1)){ sheet1.B ...
- Failed to load the JNI shared library "XXXXXXX"
今天启动Eclipse的时候出现了这个问题,经过查找, 一般来说这种问题都是因为eclipse 和Java 的兼容性不一致所导致的. 1) 查看Eclipse 和Java 版本 那么我们需要分别查看下 ...
- Java开发规范总结(两周至少看一次)
Service / DAO 层方法命名规约: 1 ) 获取单个对象的方法用 get 做前缀.2 ) 获取多个对象的方法用 list 做前缀.3 ) 获取统计值的方法用 count 做前缀.4 ) 插 ...
- 用JS制作一个信息管理平台完整版
前 言 JRedu 在之前的文章中,介绍了如何用JS制作一个实用的信息管理平台. 但是那样的平台功能过于简陋了,我们今天来继续完善一下. 首先我们回顾一下之前的内容. 1.JSON的基础知识 ...
- Data_Struct(LinkList)
最近在学数据结构,学到链表这节作业有链表,毕竟菜鸟代码基本照看书上算法写的,再加上自己的小修改,这里先记录下来,万一哪天想看了,来看看. 里面有用到二级指针,还是不太理解,还有就是注释不多,后续有了更 ...
- java中Set类接口的用法
在Java中使用Set,可以方便地将需要的类型,以集合类型保存在一个变量中.主要应用在显示列表. Set是一个不包含重复元素的collection.更确切地讲,set 不包含满足 e1.equals( ...