在spring中使用事务的方式以及注意事项,相信你看了会有很多认识
2017-03-30 23:22
447 查看
一、在spring中如何使用事务
1.在application.xml文件中配置事务管理器
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2.启动事务
<!-- 启用事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
3.为需要的类的方法下添加事务注解
//添加事务注解
/**
* 添加事务注解之后,如果某个sql出现异常。则其他语句也不会执行
*
*/
@Transactional
public void purchase(String username, String isbn) {
// TODO Auto-generated method stub
// 1.获取图书单价
int price = bookshopdao.findBookPrice(isbn);
// 2.更新图书的库存
bookshopdao.updateBookStock(isbn);
// 3.更新用户余额
bookshopdao.upateUserAccount(username, price);
}
二、事务的传播属性
1.当事务方法被另一个事务方法调用时候,必须指定事务应该如何传播。例如:方法可能继续在现有的事务中运行。也可能开启一个新的事务。并在机子的事务中运行。
2.事务的传播行为可以由传播属性制定。Spring定义了七种类传播行为。
使用注解的方式进行配置事务
/**添加事务注解。
* 下边这本来就是一个事务。他还可以调用另一个事务
*1.使用propagation指定事务传播行为,即当前的事务方法被另一个事务的方法调用时候
*如何使用事务,默认取值为REQUIRED。即使用调用方法的事务
*REQUIRES_NEW:事务自己的事务。调用的事务方法被挂起
*2.使用isolation 指定事务的隔离级别。最常用的取值为READ_COMMITTED
*3.默认情况下Spring的声明式事务对所有的运行时异常进行回滚,也可以通过对应的属性进行设置
* noRollbackFor={UserAccountException.class}即对哪些异常不进行回滚
* 通常情况下去默认值。即对所有的异常都回进行回滚
*4.使用readOnly指定事务是否为只读,表示这个事务只读区数据单不更新数据。这样可以帮助数据库引擎优化事务
*若真的是一个只读数据库的方法。应设置readOnly为true readOnly=true
*5.使用timeout指定强制回滚之前事务可以占用的时间,超过这个时间可以进行强制回滚
*
*/
// @Transactional 这是默认的事务执行方式
@Transactional(propagation=Propagation.REQUIRES_NEW,
isolation=Isolation.READ_COMMITTED,
noRollbackFor={UserAccountException.class},
readOnly=false,
timeout=3)
public void checkout(String username, List<String> isbns) {
// TODO Auto-generated method stub
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(String a:isbns){
bookshopserivice.purchase(username, a);
}
}
1.在application.xml文件中配置事务管理器
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2.启动事务
<!-- 启用事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
3.为需要的类的方法下添加事务注解
//添加事务注解
/**
* 添加事务注解之后,如果某个sql出现异常。则其他语句也不会执行
*
*/
@Transactional
public void purchase(String username, String isbn) {
// TODO Auto-generated method stub
// 1.获取图书单价
int price = bookshopdao.findBookPrice(isbn);
// 2.更新图书的库存
bookshopdao.updateBookStock(isbn);
// 3.更新用户余额
bookshopdao.upateUserAccount(username, price);
}
二、事务的传播属性
1.当事务方法被另一个事务方法调用时候,必须指定事务应该如何传播。例如:方法可能继续在现有的事务中运行。也可能开启一个新的事务。并在机子的事务中运行。
2.事务的传播行为可以由传播属性制定。Spring定义了七种类传播行为。
使用注解的方式进行配置事务
/**添加事务注解。
* 下边这本来就是一个事务。他还可以调用另一个事务
*1.使用propagation指定事务传播行为,即当前的事务方法被另一个事务的方法调用时候
*如何使用事务,默认取值为REQUIRED。即使用调用方法的事务
*REQUIRES_NEW:事务自己的事务。调用的事务方法被挂起
*2.使用isolation 指定事务的隔离级别。最常用的取值为READ_COMMITTED
*3.默认情况下Spring的声明式事务对所有的运行时异常进行回滚,也可以通过对应的属性进行设置
* noRollbackFor={UserAccountException.class}即对哪些异常不进行回滚
* 通常情况下去默认值。即对所有的异常都回进行回滚
*4.使用readOnly指定事务是否为只读,表示这个事务只读区数据单不更新数据。这样可以帮助数据库引擎优化事务
*若真的是一个只读数据库的方法。应设置readOnly为true readOnly=true
*5.使用timeout指定强制回滚之前事务可以占用的时间,超过这个时间可以进行强制回滚
*
*/
// @Transactional 这是默认的事务执行方式
@Transactional(propagation=Propagation.REQUIRES_NEW,
isolation=Isolation.READ_COMMITTED,
noRollbackFor={UserAccountException.class},
readOnly=false,
timeout=3)
public void checkout(String username, List<String> isbns) {
// TODO Auto-generated method stub
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(String a:isbns){
bookshopserivice.purchase(username, a);
}
}
相关文章推荐
- spring中声明式事务管理控制介绍以及使用XML方式实现
- Spring 声明式事务中使用注解@Transactional的方式、原理及注意事项
- 如何使用spring @component 以及注意事项
- Spring中事务管理支持哪几种方式以及每种方式的具体使用方法
- spring使用拦截式事务的注意事项
- Spring多数据源使用注解事务绑定注意事项和解决办法
- new与delete函数使用方法以及注意事项
- 使用sql语句备份和恢复SQLserver数据库,以及需要注意的事项
- SWFupload使用注意事项以及附带页面变量
- 检测Qt for symbian前后台切换 以及 信号槽使用的注意事项
- c#事务的使用、示例及注意事项
- c#事务的使用、示例及注意事项(转)
- 精通cobol--9.7.2 使用顺序查找方式的注意事项
- c#事务的使用、示例及注意事项
- 关于使用存储过程的一些好处以及注意事项
- 关于使用存储过程的一些好处以及注意事项
- c#事务的使用、示例及注意事项
- ODP.NET 2.0使用注意事项以及与1.0的区别
- Spring视频学习(九)使用Spring注解方式管理事务与传播行为详解
- 多线程的SqlBulkCopy批量导入、事务和SqlBulkCopy使用的数据集中自定义映射字段的注意事项