博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring事务5种属性
阅读量:6707 次
发布时间:2019-06-25

本文共 2109 字,大约阅读时间需要 7 分钟。

hot3.png

1、事务传播行为

propagation

① REQUIRED(默认)

② REQUIRES_NEW

2、事务隔离级别

isolation

① Isolation.READ_UNCOMMITTED(会出现脏读,不可重复读,幻读 ,避免了 第一类丢失 更新)

Isolation.READ_COMMITTED(会出现不可重复读,幻读)

③ Isolation.REPEATABLE_READ(会出现幻读)

④ Isolation.SERIALIZABLE

⑤ DEFAULT(默认,采用数据库默认隔离级别)

3、事务回滚属性(针对异常属性,值均为数组{})

noRollbackFor = {UserAccountException.class}

noRollbackForClassName(类全限定名)

rollbackFor

rollbackForClassName

4、事务只读属性

readOnly = false/true

5、事务超时属性

timeout = 3 //单位s

6、代码说明

package com.lty.tx;import java.util.concurrent.TimeUnit;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;@Service("bookShopService")public class BookShopServiceImpl implements BookShopService {		@Autowired	private BookShopDao bookShopDao;	//添加事务注解	//1、使用propagation指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时	//如何使用事务,默认取值为REQUIRED,即使用调用方法的事务	//REQUIRES_NEW:使用自己的事务,调用事务方法的事务被挂起	//2、使用isolation指定事务的隔离级别,最常用的取值为Isolation.READ_COMMITED	//3、默认情况下Spring的声明式事务对所有的运行时异常均进行回滚,也可以通过对应的属性	//进行设置,通常情况下取默认值即可	//4、使用readOnly指定事务是否为只读,表示该事务只读取数据但不更新数据,	//这样可以 帮助数据库引擎优化事务(若确实是只读取数据库值的方法,应设置readOnly=true)	//5、使用timeout指定强制回滚事务之前事务可以占用的时间,以提高响应速度	@Transactional(propagation = Propagation.REQUIRES_NEW,			isolation = Isolation.READ_COMMITTED,//			noRollbackFor = {UserAccountException.class}			readOnly = false,			timeout = 3 //单位s			)	@Override	public void purchase(String username, String isbn) {		try {			TimeUnit.SECONDS.sleep(5);		} catch (InterruptedException e) {					}				//1、获取书的单价		int price = bookShopDao.findBookPriceByIsbn(isbn);				//2、更新书的库存		bookShopDao.updateBookStock(isbn);				//3、更新用户余额		bookShopDao.updateUserAccount(username, price);	}}

 

注意的几点

1、@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能。

 

2、默认情况下,一个有事务方法, 遇到RuntiomeException 时会回滚 .  遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) 。

 

参考资料

转载于:https://my.oschina.net/Howard2016/blog/1553636

你可能感兴趣的文章
u盘格式化后数据能恢复吗,格式化数据恢复方法
查看>>
Android进阶知识:事件分发与滑动冲突(二)
查看>>
默认路由 0.0.0.0
查看>>
基础拾遗 -- 再学程序流程图
查看>>
小公司与大企业 -- 如何选择
查看>>
Linux基础知识——shell命令类型及命令使用帮助
查看>>
centos6 jenkins安装
查看>>
AS3步进器
查看>>
linux运维面试题
查看>>
@Objective-c入门 1(类,对象,方法)
查看>>
字符串函数snprintf
查看>>
安装cacti过程中的各种报错以及解决方法
查看>>
JS将数字转换成三位逗号分隔的样式
查看>>
一些OJ网站
查看>>
xmake构建程序演示
查看>>
zabbix监控apache
查看>>
Debian系统apt-get命令整理
查看>>
10月第3周网络安全报告:境内被篡改网站升至4202个
查看>>
我的友情链接
查看>>
都996了,研发效能还是提不出起来,关键在这里
查看>>