-
什么是事务?
事务是程序中一系列严密的操作,所有操作必须成功完成,否则每个操作所做的操作将会撤销,这是事务的原子性(要么成功,要么失败),
-
事务特性
事务特性分为四个:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持续性(Durability),简称ACID.
- 原子性:事务是数据库逻辑工作单元,事务中包含的操作要么都执行成功,要么都执行失败.
- 一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态.当事务执行成功后就说明数据库处于一致性状态.如果执行过程中发生错误,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这是数据库就处于不一致状态.
- 隔离性:一个事务的执行过程中不能影响到其他事务的执行,即一个事务内部的操作及使用的数据对其他事务是隔离的,并发执行各个事务之间无不干扰。
- 持续性:即一个事务执一旦提交,它对数据库数据的改变是永久性的。之后的其它操作不应该对其执行结果有任何影响。
-
事务的隔离界别
事务的隔离级别也分为四种,由低到高依次分别为:read uncommited(读未提交)、read commited(读提交)、read repeatable(读重复)、serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
脏读 不可重复读 幻读 未提交读 √ √ √ 提交读 × √ √ 重复读 × × √ 序列化 × × × - 未提交读:最低的事务隔离界别,它允许另一个事务可以看到这个事务未提交的数据
- 提交读:保证一个事务提交后才能被另一个事务读取,另一个事务不能读取该事物未提交的数据
- 重复读:这种隔离界别可以防止脏读,不可重复读.但可能出现幻读,除了保证一个事务不能被另一个事务赌球未提交的数据之外还避免了不可重复读.
- 序列化:这是花费代价最高但最可靠的隔离界别.事务被处理为顺序执行.
spring事务传播特性:
事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。spring支持7种事务传播行为:
- propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
- propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
- propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
- propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
- propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就当前事务挂起。
- propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
- propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作
Spring 默认的事务传播行为是 PROPAGATION_REQUIRED,它适合于绝大多数的情况。假设 ServiveX#methodX() 都工作在事务环境下(即都被 Spring 事务增强了),假设程序中存在如下的调用链:Service1#method1()->Service2#method2()->Service3#method3(),那么这 3 个服务类的 3 个方法通过 Spring 的事务传播机制都工作在同一个事务中。