1、什么是事务
事务是指将一系列数据操作捆绑成为一个整体进行统一管理,如果某一事务执行成功,则在该事物中进行的所有数据更改均会提交,成为数据库中的永久组成部分;如果事务执行时遇到错误且必须取消或回滚,则数据将全部恢复到操作前的状态,所有数据的更改均被清除。
简单的说:
事务是作为单个逻辑工作单元执行的一系列操作
事务是一个不可分割的工作逻辑单元
多个操作作为一个整体向系统提交,要么都执行,要么都不执行
事务具有四个特征:
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability),这些通常简称为ACID
2、事务的四个特征(ACID)
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。
一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。
也就是说事务前后数据的完整性必须保持一致。
隔离性(Isolation)
隔离性是指一个事务的执行不能有其他事务的干扰,事务的内部操作和使用数据对其他的并发事务是隔离的,互不干扰。
持久性(Durability)
持久性是指一个事务一旦提交,对数据库中数据的改变就是永久性的。此时即使数据库发生故障,修改的数据也不会丢失。接下来其他的操作不会对已经提交了的事务产生影响。
3、事务的隔离级别
DEFAULT
DEFAULT 这是spring默认的隔离级别,表示使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应。
未提交读(Read Uncommitted)
一个事务能够读取到别的事务中没有提交的更新数据。事务中的修改,即使没有提交,其他事务也可以看得到。在这种隔离级别下有可能发生脏读,不可重复读和幻读。
提交读(Read Committed)
事务中的修改只有提交以后才能被其它事务看到。在这种隔离级别下解决了脏读,但是有可能发生不可重复读和幻读。
可重复读(Repeated Read)
保证了在同一事务中先后执行的多次查询将返回同一结果,看到的每行的记录的结果是一致的,不受其他事务的影响。但是这种级别下有可能发生幻读。
可串行化(Serializable)
不允许事务并发执行,强制事务串行执行。就是在读取的每一行数据上都加上了锁,读写相互都会阻塞,所以效率很低下。这种隔离级别最高,是最安全的,但是性能最低,不会出现脏读,不可重复读,幻读。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read Uncommitted | YES | YES | YES |
Read Committed | NO | YES | YES |
Repeated Read | NO | NO | YES |
Serializable | NO | NO | NO |
注意:事务的隔离级别和数据库并发性是成反比的,隔离级别越高,并发性越低。
4、事务的传播行为
1、REQUIRED:spring默认的事务的传播性
REQUIRED 表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
2、REQUIRES_NEW
REQUIRES_NEW 表示创建一个新的事务,如果当前存在事务,则把当前事务挂起。换言之,不管外部方法是否有事务,REQUIRES_NEW 都会开启自己的事务。
3、NESTED
NESTED 表示如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 TransactionDefinition.PROPAGATION_REQUIRED。
4、MANDATORY
MANDATORY 表示如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
5、SUPPORTS
NOT_SUPPORTED 表示以非事务方式运行,如果当前存在事务,则把当前事务挂起。
6、NOT_SUPPORTED
NOT_SUPPORTED 表示以非事务方式运行,如果当前存在事务,则把当前事务挂起。
7、NEVER
NEVER 表示以非事务方式运行,如果当前存在事务,则抛出异常。