Spring事务细节

1、事务的传播性

问题:当有两个事务嵌套执行时,那么其中一个事务发生异常另一个事务是否需要回滚呢?

思考模式:把事务看成一个对象,看看这两个事务有没有共用一个事务对象:

  • 若共用一个,则都成功或都失败;
  • 若没有共用一个事务对象,则两个事务之间没有关系。

事务传播性的几种类型

1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
2、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘
3、PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
4、PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
5、PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6、PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
7、PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

2、事务的隔离性

问题:
1、脏读:两个事务,一个事务改了值但是还没提交,另一个事务读了改之后的值,第一个事务回滚了,导致第二个事务读到的是脏数据怎么办?(最严重!!!绝不能允许发生!!!)
2、不可重复读:两个事务,一个事务读了数据,另一个事务改了数据,这个第一个事务在来读这个数据发现读到的数据不一样了怎么办?
3、幻读:两个事务,一个事务插入了几条数据,另一个事务又插入的几条数据,这时第一个事务在来读发现数据多了,感觉自己出现了幻觉。这种情况怎么办?

解决方案:
数据库事务的隔离级别有4种,由低到高分别为:
Read uncommitted(读未提交,可以读未提交的数据)
Read committed (读已提交,只能读已提交的数据)
Repeatable read (可重复读,一个事务结束前保证每次读到的数据都一样)
Serializable(串行化,不推荐,等待一个事务提交(commit),其他事务才开始执行)

猜你喜欢

转载自blog.csdn.net/gogletech/article/details/79637893