需要了解的spring事务特性

一、spring事务的四大特征:

  原子性:一个事务中所有的操作都是一个整体,要么都成功,要么都失败。

  一致性:事务的执行的前后数据的完整性保持一致。

  隔离性:一个事务在执行的过程中,不应该受到其他事务的干扰。

  持久性:事务提交后对数据库的修改是永久的。

  原子性与一致性的区别:

    原子性是保证最终结果的正确。

    一致性是针对事务操作过程中数据的可见性,只有最初的数据和最终的数据对外可见,避免在“未提交读”的情况下造成脏读。

二、事务的五大隔离级别:

  default:默认的事务隔离级别,使用数据库默认的数据隔离级别。MySQL默认的事务隔离级别是“可重复读(repeatable_read)”。

  read_uncommitted:读未提交,一个事务可以操作另一个未提交的事务,可能会出现脏读、不可重复读、幻读。

扫描二维码关注公众号,回复: 7766952 查看本文章

  read_committed:读已提交,一个事务只能操作另一个已经提交的事务,可能会出现不可重复读、幻读。

  repeatable_read:可重复读,能够避免脏读,不可重复读,不能避免幻读。

  serializable:串行化,隔离级别最高,消耗资源最低,代价最高,能够防止脏读, 不可重复读,幻读。

  脏读:事务A读取到了事务B未提交的数据,此时如果事务B因为发生错误并执行回滚,那么事务A读到的数据就是脏数据。

  不可重复读:事务A在执行过程中多次读取同一条数据,但是由于这条数据中途被事务B修改并提交,导致事务A多次读取的数据不一致,这种现象被称为“不可重复读”。如果多次读取数据一致,则是“可重复读”。

  幻读:事务A在执行过程中多次获取数据列表,执行过程中事务B新增或删除了数据,导致查询结果不一致,这种情况被称为“幻读”。

  不可重复读和幻读的区别:“不可重复读”是针对的update操作,可用行级锁解决。“幻读”是针对insert和delete操作,可用表级锁解决。

三、事务的七大传播特性:

  Propagation.REQUIRED:如果调用方已经存在事务,则加入到同一个事务中运行,否则重新开启一个新事务。

  Propagation.SUPPORTS:如果调用方已经存在事务,则加入到同一个事务中运行,否则以没有事务的方式运行。

  Propagation.MANDATORY:如果调用方已经存在事务,则加入到同一个事务中运行,否则抛出异常。

  Propagation.REQUIRES_NEW:不管之前有没有事务存在,都开启一个新的事务。

  Propagation.NOT_SUPPORTED:如果调用方已经存在事务,则将事务挂起,以没有事务的方式运行,结束后事务恢复正常。

  Propagation.NEVER:如果调用方已经存在事务,则抛出异常。

  Propagation.NESTED:如果调用方已经存在事务,则执行嵌套事务。

猜你喜欢

转载自www.cnblogs.com/tjpblog/p/11806829.html