spring事务的传播机制及隔离级别

这是高频的面试题,一般会与隔离级别连着问,

传播机制

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类似的操作。
主要根据改变父类和子类的传播方式,查看最后父子两类是否回滚.

隔离级别

第一隔离级别.读未提交:两个事务之间,a事务执行完sql语句,还没提交的时候,b事务就可以读取到a事务执行完的结果,出现了***脏读现象***。
第二隔离级别.读已提交:两个事务开启之后,a事务执行的结果只有提交之后b事务才能读取到,出现一种现象:当b事务开启之后,比如早上查询的结果有14条记录,a事务在中午的时候进行了删除操作,b事务在晚上查询的时候发现没有14条记录了,出现***不可重复读问题***。
第三隔离级别.可重复读:为了解决不可重复读问题,则出现了第三隔离级别,两个事务开启之后互不干扰,即a事务开启之后,无论b事务做了什么操作,都不会影响a事务的查询结果,直到a事务结束,这样又出现了一个问题,那就是***幻读现象***,就是b事务明明把数据删除了,但是a事务中还是能查到。(这是MySQL的默认隔离级别)
第四隔离级别.序列化读/串行化读:就是同一时间只有一个事务开启了,再开启第二个事务的时候只能排队,等前面的事务结束之后才能开启,第四隔离级别完美的解决了以上的所有问题,但是执行效率太低

你可能感兴趣的:(mysql数据库,spring,面试)