事务的4个特性
1、原子性(atomicity):事务是一个原子操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用。
2、一致性(consistency):一旦所有事务的动作完成,事务就被提交,数据和资源就处于一种满足业务规则一致状态中。
3、隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
4、持久性(durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响。通常情况下,事务的结果被写到持久化存储器中。
事务传播属性
-
当事务被方法的另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新的事务,并在自己的事务中运行。
-
事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为。
传播属性 描述 REQUIRED 如果有事务在运行,当前的方法就在这个事务内运行,否则,就启动一个新的事务,并在自己的事务内运行。 REQUIRED_NEW 当前的方法必须启动新事务,并在他自己的事务内运行,如果有事务正在运行,应该将他挂起。 SUPPORTS 如果有事务正在运行,当前的方法就在这个事务内运行,否则他可以不运行在事务中。 NOT_SUPPORTED 当前的方法不应该运行在事务中。如果有运行的事务,将他挂起。 MANDATORY 当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常。 NEVER 当前的方法不应该运行在事务中,如果有运行的事务,就抛出异常。 NESTED 如果有事务正在运行,当前的方法就应该在这个事务的嵌套事务内运行。否则,就启动一个新的事务,并在它自己的事务内运行。
数据库事务隔离级别
隔离级别 | 描述 |
---|---|
READ UNCOMMITTED(读未提交) | 事务中最低的级别。在该级别下的事务可以读取到另一个事务中未提交的数据,被称为脏读(Dirty Read) |
READ COMMITTED(读提交) | 在该级别下的事务只能读取其他事务已经提交的内容,可避免脏读但不能避免重复读和幻读的情况 |
REPEATABLE READ(可重复读)MySQL默认的事务隔离级别 | 它可以避免脏读和不可重复读。 |
DEFAULT | 默认隔离级别,每种数据库支持的事务隔离级别不一样,如果Spring配置事务时将isolation设置为这个值的话,那么将使用底层数据库的默认事务隔离级别 |
SERIALIZABLE(可串行化) | 是事务的最高隔离级别,它会强制对事务进行排序,使之不会发生冲突,从而解决脏读、幻读、重复读的问题。但是,该级别可能导致大量的超时现象和锁竞争,实际应用中很少使用。 |
重复读就是在事务内重复读取别的线程已经提交的数据时读取的结果不一致。导致该问题的原因是查询的过程中其它事务做了更新操作。
幻读是指在一个事务内两次查询中数据条数不一致。导致该问题的原因是查询的过程中其它的事务做了添加操作。
脏读在该级别下的事务可以读 取到另一个事务中未提交的数据也被称为脏读(Dirty Read)。
不可重复读是指事务中两次査询的结果不一致,原因是在査询的过程中其它事务做了更新等操作。