1、事务的概念:
为了达到某个目的而做的一系列操作,要么一起成功(事务提交),要么一起失败(事务回滚)
事务的四大特性分别为:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。
1 、原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到,这样A和B账户金额总和就和转账后不一致。
3 、隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
2、事务的隔离级别
分为四种:事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。
脏读:读到其他事务未提交的数据
不可重复读(偏向同一条数据的修改):对于数据库同一条数据,一个事务内多次读取,返回不同结果。由于在查询的时间段内被其他事务修改了
幻读(偏向数据集的新增和删除):一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的
Read uncommitted
读未提交,顾名思义,就是读到其他事务未提交的数据,这种会产生脏读
Read committed
读已提交,就是一个事务要等另一个事务已经提交了,才能读取到数据,会产生不可重复读
Repeatable read
重复读,就是开始读取数据时(事务开始时),不允许修改操作,会产生幻读
Serializable
是最高的事务隔离级别,事务串行化顺序执行,可以避免脏读,不可重复读,幻读,但是效率很低,不经常用
大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。
Mysql的默认隔离级别是Repeatable read。
Oracle支持2种事务隔离级别:READ_COMMITED,SERIALIZABLE
3、spring事务的七种传播行为
- PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是默认的事务传播行为
- PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
- PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。(一个新的事务将启动,而且如果有一个现有的事务在运行的话,则这个方法将在运行期被挂起,直到新的事务提交或者回滚才恢复执行。)
- PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则新建一个事务。(外层事务抛出异常回滚,那么内层事务必须回滚,反之内层事务并不影响外层事务)
注: 这里面的事务的挂起的意思是,被挂起的事务影响不了当前方法。