一、什么是事务?
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
二、事务的四大特性
- 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
- 隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行
相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,
必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。 - 持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
三、事务的隔离级别
隔离级别 | 描述 |
---|
DEFAULT: | 使用底层数据库的默认隔离级别。对于大多数数据库来说,默认隔离级别都是READ_COMMITTED |
READ_UNCOMMITTED: | 允许事务读取未被其他事务提交的变更。脏读、不可重复读和欢度问题都会出现 |
READ_COMMITTED: | 只允许事务读取已经被其他事务提交的变更。可以避免脏读,但不可重复读和幻读问题仍然可能出现 |
REPEATABLE_READ: | 确保事务可以多次从一个字段中读取相同的值。在这个事务持续期间,禁止其他事务对这个字段进行更新。可以避免脏读和不可重复读,但幻读问题仍然存在 |
SERIALIZABLE: | 确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表插入、更新和删除操作。所有并发问题都可以避免,但性能低下 |
四、事务的传播机制
传播属性 | 描述 |
---|
REQUIRED: | 如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择 |
REQUIRED_NEW: | 新建事务,如果当前存在事务,把当前事务挂起 |
SUPPORTS: | 支持当前事务,如果没有当前事务,就以非事务方法执行 |
NOT_SUPPORTED: | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 |
MANDATORY: | 使用当前事务,如果没有当前事务,就抛出异常 |
NEVER: | 以非事务方式执行操作,如果当前事务存在则抛出异常 |
NESTED: | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就新建一个事务 |