1. 事务的概念
什么是事务?
事务必须服从ACID原则。ACID指的是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。
通俗理解,事务其实就是一系列指令的集合。
-------------------************-------------
事务的4大特性
原子性:事务更改要么全部成功,要么全部失败
一致性:事务提交后,所有数据都必须一致
隔离性:事务之间不能相互影响
持久性:一旦事务更新,对数据库的改变都应该是永久的。
---------------*******----------------------
并发事务的常见问题
脏读:一个事务读到另一个事务未提交的更新数据
不可重复读:事务A读取到了事务B更改的数据
幻读:事务A读取到事务B新增的数据
---------------*******----------------------
spring事务的隔离级别 (针对数据库的,实际就是锁表,锁行)
1.isolation_default 默认的隔离级别 -1
2.isolation_read_uncommitted 允许脏读,重复读和幻读 1
3.isolation_read_committed (保证一个事务修改的数据提交后才能被另一个事务读取到)不允许脏读,重复读,可能出现幻读 2
4.isolation_repeatable_read 可以防止脏读,禁止不可重复读,但是可能出现幻读 4
5.isolation_serializable 可以避免脏读,重复读,幻读,隔离级别最高 8
---------------------------------------------
spring7种事务传播行为 (针对方法间的传播行为)
1.propagation_required --spring默认的事务传播行为,如果没有,就新建一个,如果有,就加入当前事务(适合绝大多数情况)
2.propagation_requires_new --如果没有,就新建,如果有,就将当前事务挂起。(新建一个事务和原来的事务没有关系)
3.propagation_nested --如果没有,就新建,如果有,就嵌入(当主事务提交或回滚,子事务也提交或回滚)
4.propagation_supports --如果没有,就没有,有就使用当前事务(无所谓,有就用,没有就算了)
5.propagation_not_supported --如果没有,就没有,如果有,就将当前事务挂起(意思就是不支持事务)
6.propagation_never --如果没有,就没有,如果有,就抛异常(坚决不支持事务)
7.propagation_mandatory --如果没有,就抛异常,如果有,就使用当前事务(必须要使用事务)
总结:required 新建,requires_new 当前挂机并新建,nested 嵌入
------------------------------------------------
事务超时:transcation timeout 为了解决事务时间太长,消耗资源太多。 事务时间超过最大时长,就回滚
只读事务: readonly transcation 为了忽略那些不需要事务的方法,比如读取数据,这样可以提高效率