隔离级别,回滚,只读,过期。

一、并发事务所导致的问题

当同一个程序或者不同程序的多个事务在同一个数据集上并发执行时,可能会出现许多意外的问题。

并发事务导致的问题大概可分为三种类型:

  1. 脏读:对于两个事物t1,t2,t1读取了已经被t2更新但是还没有提交的字段,之后t2回滚了,那么t1读取的内容就是临时并且无效的。
  2. 不可重复读:对于两个事物t1,t2,t1读取了一个字段,然后t2更新了这个字段,之后t1再去读这个字段,两个值是不同的。
  3. 幻读:对于两个事物t1,t2,t1从一个表中读取了一个字段,然后t2在该表中插入了一些新的行,之后,如果t1再次读取同一个表,就会多出几行。

二、更多spring事务的属性

(1)propagation=Propagation.REQUIRES_NEW

传播属性。

指定事务的传播行为,即当前事务方法被另外一个事务方法调用时,如何使用事务,默认取值为REQUIRED,,即使用调用方法的事务。

(2)isolation=Isolation.READ_COMMITTED

隔离属性。

使用isolation指定事务的隔离级别,最常用的取值为READ_COMMITTED。

(3)noRollbackFor={buyermoneyexception.class}

事务的回滚属性。

默认情况下,spring的声明式事务对所有运行时的异常进行回滚,也可以通过对应的属性进行设置。

也可以设置成某些异常不进行回滚。

比如:noRollbackFor=buyermoneyexception.class

因为设置了noRollbackFor={buyermoneyexception.class},金额的异常不会导致数据回滚。

假设我现有金额为20,书的价格为100,连一本都买不起。我开始买书,库存量-1,然后判断现有金额买不起这本书,报错。

本来这里是应该进行回滚的,但是因为设置了金额报错不回滚,虽然扣款不执行,但是库存-1的错误无法回滚,结果变成错误的-1。

(4)readOnly=false

是否只读。

表示这个事务只读取数据但是不更新数据,这样可以帮助数据库引擎优化事务。

简单解释就是只能读不能写,只能读取不能改变。

(5).timeout=3

timeout指定强制回滚之前事务可以执行的时间。

防止事务超时,一旦超时就直接回滚,可以很好地缩短事务占用链接的时间,一旦超时就进行释放。

给方法一个休眠2000毫秒:

因为设定回滚时间为3秒,时间足够,数据没有回滚。

如果设置休眠5000毫秒,事务超时,数据回滚。

三、总结

以上都是注解形式配置事务,下一篇文章尝试用xml配置事务。

发表评论

电子邮件地址不会被公开。 必填项已用*标注