spring事务管理

spring 提供了声明事务管理机制,在应用程序中可以让spring来统一管理事务,简化编程提高开发效率。
在这里以spring管理jpa事务为例
使用@PerstenceContext注解为应用注入实体管理器也就是EntityManager对象,简化的写一下代码,这样EntityManager对象就由容器来管理,在spring的配置文件中加入事务的配置,spring就可以管理应用的事务

@PerstenceContext
protected EntityManager em;


定义一个简单的service类(一般都把事务放在service层),使用注解配置事务

@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
void saveGoods(Goods goods);
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
void removeGoods(Goods goods);
//查找方法不需要配置事务
Goods getGoodsById(int id);
/**
* 配置事务
*
*/
@Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
void updateGoods(Goods goods);


[color=red] 注意在Service层一定要加上@Transactional注解,否则无法向数据库更新或删除记录。因为从spring容器注入的EntityManager是开启事务的,不加这个注解,不会向数据库提交。[/color]
[size=large]
下面简单说下@Transactional属性
直接在一个方法上写@Transactional,属性默认值
propagation= propagation.REQUIRED
rollbackFor=RuntimeException.class
readonly=false
事务的传播特性
1 PROPAGATION_REQUIRED
没有事务就开启一个事务,有事务就不在开启新事务,比如UserService有a和b方法,两个方法加上了@Transactional(propagation= propagation.REQUIRED
),在a方法中调用b方法,在执行a方法时如果没有事务,就开启一个事务,如果已经存在事务则在事务中运行,在执行b方法时,发现已经开启事务,则在事务中执行,这样任何一个发生异常,事务就会回滚,保证数据的正确性,spring默认使用这种事务级别。
2 PROPAGATION_SUPPORTS
如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形 式运行。

3 PROPAGATION_MANDATORY
必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。

4 PROPAGATION_REQUIRES_NEW
不管当前是否存在事务,都新创建一个事务,比如UserService有a和b方法,b方法加上了@Transactional(propagation= propagation.PROPAGATION_REQUIRES_NEW
),在a方法中调用b方法,如果a方法已经开启一个事务,在执行b方法时,a事务会被挂起,b方法新启动一个事务,b方法执行完,a方法事务恢复继续执行,这样a方法发生了异常,数据回滚,但b方法不会回滚,因为a和b方法不在同一个事务中运行。
5 PROPAGATION_NOT_SUPPORTED
以非事务方式执行,如果当前存在事务,就把当前事务挂起,以非事务方式执行。
6 PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常
readonly设置事务是否为只读事务
在jdbc中设置为true,说明这个事物是只读事物,不能执行更新删除操作,否则抛出异常,如果使用orm框架,则是一个优化提示,比如hibernate,则设置session的session的FlushModeType为FlushModeType.NEVER,这样hibernate就不会花费时间维护缓存与session缓存的数据同步,提高执行速度。个人认为,在查询方法中一般不用加事物,加上事物会增大开销。
rollbackFor
默认情况下,在程序抛出了运行时异常时,数据自动回滚,有时侯这样不满足要求,一般把这个属性值设置为Exception.class,出现异常事物就回滚。



[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值