事务是不可分割的操作集合
事务的四大特性
- 原子性
说事务是一个不可分割的整体,同一个事务中的多条语句是不可分割的。 - 一致性
事务执行的结果必须使数据库从一个一致状态变换到另一个一致状态。 - 隔离性
一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 - 持久性
也称永久性,指一个事务一旦提交,对数据库的改变是永久的。
数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。
脏读
表示一个事务能够读取另一个事务中还未提交的数据
不可重复读
事务在两次读取之间该数据被其它事务所修改,则两次读取的数据不同,我们称之为不可重复读。
幻读
指同一个事务内多次查询返回的结果集不一样,一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
事务隔离级别
Spring的事务传播行为
- PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
- PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
- PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
- PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按 REQUIRED 属性执行。