概述
什么是事务?
事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)
事务的特性
- 原子性:事务是数据库逻辑工作单元,事务中包含的操作要么都执行成功,要么都执行失败。
- 一致性:事务执行的结果必须是使数据库数据从一个一致性状态变到另外一种一致性状态。当事务执行成功后就说数据库处于一致性状态。如果在执行过程中发生错误,这些未完成的事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于不一致状态。
- 隔离性:一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间不干扰
- 持续性:即一个事务一旦提交,它对数据库数据的改变是永久性的。之后的其他操作不应该对其执行效果有任何影响
事务的隔离级别
- read uncommited(读未提交) 是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。
- read commited(读已提交)保证一个事务提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据
- repeatable read(可重复读)这种事务隔离级别可以防止脏读、不可重复读。但是可能会出现幻想读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生
- Serializable(序列化)这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻想读
Spring事务传播特性
Spring默认的事务传播行为是PRPAGATION_REQUIRED.
Spring的API设计很不错,基本上根据英文翻译就能知道作用:
- Required:必须的。说明必须要有事务,没有就新建事务。
- Supports:支持的。说明仅仅是支持事务,没有事务就非事务方式执行。
- Mandatory:强制的。说明一定要有事务,没有事务就抛出异常。
- Required_new:必须新建事务。如果当前存在事务就挂起。
- Not_supported:不支持事务,如果存在事务就挂起。
- Never:绝不有事务。如果存在事务就抛出异常。
下面是对各事务的精准分析
- PROPAGTION_REQUIRED–支持当前事务,如果没有当前事务,就新建一个事务,这是最常见的选择
- PROPAGTION_SUPPORTS–支持当前事务,如果没有当前事务,就以非事务方式执行。
- PROPAGTION_MANDATORY–支持当前事务,如果当前没有事务,则抛出异常
- PROPAGTION_REQUIRED_NEW–新建事务,如果当前存在事务,则把当前事务挂起
- PROPAGTION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
- PROPAGTION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。