一、事务
注:Spring原理是不存在事务之说的,事务是对于数据库来说的。例如:mysql,Oracle等。
事务常见名词:
- 脏读:指事务在处理过程当中读取到了另外事务未提交的数据。
- 不可重复读:指在一个事务范围内,多次查询某个数据时得到的结果不相同。
- 幻读:指事务在对某行数据更改时,同时别的事务插入了相同的值,这样再读取数据时会产生数据没有更改的错觉。
事务隔离级别:
- Serializable(串行化):代价最高且最可靠的隔离级别,当出现读写锁时。后面的事务必须要等到上个事务执行完成。
- Repeatable read(可重复读):多次读取同一范围的数据并且返回第一次查询结果。默认级别。
- Read committed(读已提交):保证一个事务提交之后才被另一个事务读取。
- Read uncommitted(读未提交):当事务还没提交时,做的变更就能被别的事务看到。
二、Spring事务传播机制
REQUIRED(默认事务传播):
支持事务,当业务在执行业务时,加入当期事务/重新开一个事务,当外层事务提交时,内层事务才可以被提交;若内/外层报错则一起回滚代码,如果内层报错及时使用了try catch则也会回滚事务
REQUIRES_NEW:
支持事务,每次都创建一个新事务,当当前已在任务列表中则会挂起新事务,内层事务结束内层就提交,不用等待外层。内/外层报错互相不影响。若内层报错 回滚,抛出异常,外层没有捕获该异常则外层也会回滚。
NESTED:
支持事务,若当前已在事务当中则嵌套到已有事务中作为子事务,若不存在则新开一个事务。事务在提交时会和外层事务一起提交,外层回滚则内层也回滚事务,若内层回滚事务,外层不受影响。
SUPPORTS:
支持事务,若存在事务就支持事务,不存在则没有事务处理,不会新开启一个事务。
MANDATORY:
支持事务,当业务执行时已存在一个事务就加入,否则就报错。
NOT_SUPPORTED:
不支持事务,当业务执行当中存在事务,则将事务挂起,等方法执行完毕在 恢复事务。
NEVER:
不支持事务,如果存在一个事务则报错处理。