事务学习总结
目录
事务四大特性
事务四种隔离级别
事务七种传播行为
事务四大特性
原子性Atomicity 要么同时成功,要么同时失败。事务一旦发生失败就会回滚到原来最初的样子,仿佛没有发生过一样
一致性Consistency 事务处理前后,数据完整性要保持一致。 a500 b500; a->b 200; a300 b 700 前后的a+b 总和始终是1000
隔离性Isolation 允许多个并发事务同时对数据进行读写和修改操作, 隔离性防止 出现多事务并发出现交叉执行导致数据不一致问题。
持久性durability 事务一旦提交,数据就会保存下来,即使系统故障也不会丢失
事务并发问题:
角色a银行卡余额1000元,角色b(a老婆);角色b购物-500元未付款确认,此时角色a看银行卡余额剩500,当b取消付款,角色a看到余额变成1000,就出现了的问题(读取未提交)脏读
角色a银行卡余额1000元,角色b(a老婆);此时角色a和角色b在不同地方同时消费800元的物品,当其中一方确认付款后,另一方发现提示余额不足,此时就出现了问题(读取已提交)不可重复度
角色a打印账单时,角色a的对象角色b此时刚好又消费了一笔,打印出的账单和预期的账单不一样(读取已提交)幻读
事务四种隔离级别
读未提交(Read uncommitted) 一个事务读取了另一个未提交事务的数据
读已提交(read committed) 只能读取已提交的事务
可重复读(repeatable read) 事务开启时,同一个数据可以被不同角色读取,但读取的内容一致
序列化(Serializable) 事务的有序执行
事务七种传播行为(待验证)
<xsd:enumeration value="REQUIRED"/><xsd:enumeration value="SUPPORTS"/><xsd:enumeration value="MANDATORY"/><xsd:enumeration value="REQUIRES_NEW"/><xsd:enumeration value="NOT_SUPPORTED"/><xsd:enumeration value="NEVER"/><xsd:enumeration value="NESTED"/>
REQUIRED(spring容器默认的)
若当前存在事务则加入该事务,若不存在则新建事务。例如,方法A调用方法B时,若A已开启事务,B会加入A的事务;若A未开启事务,B会新建一个事务。
SUPPORTS
支持当前事务,若存在则加入;不存在则以非事务方式执行。例如,方法B标注为SUPPORTS时,若调用方未开启事务,B不会触发新事务。
MANDATORY
必须加入现有事务,若不存在则抛出异常。例如,方法B要求必须加入当前事务才能执行。
REQUIRES_NEW
无论是否存在事务,都会新建独立事务。例如,方法B要求始终以新事务执行,与调用方无关。
NOT_SUPPORTED
以非事务方式执行,若存在事务则挂起当前事务。例如,方法B执行时不参与调用方的事务。
NEVER
以非事务方式执行,若存在事务则抛出异常。例如,方法B明确拒绝加入任何事务。
NESTED
若存在事务则在嵌套事务中执行;若不存在则按REQUIRED方式处理。例如,方法B在嵌套事务中运行时,其操作依赖于外部事务的状态