一、MySQL数据库存在的3种读取问题
脏读:一个事务有可能读取了另一个事务改写但没提交的数据,如果回滚,那读取的就是无效数据
不可重复读:在同一个事务中,多次读取同一数据时,返回的结果却不相同;后续读取可能读取到另一个事务提交的更新数据
幻读:一个事务读取几行记录后,另一个事务有插入了几行记录,在后来的查询中,第一个事务就会发现原来没有的记录
二、Spring事务与MySQL数据库隔离级别的关系
Spring事务是基于数据库隔离级别的封装
4种隔离级别,解决3种读取问题,高并发为了下保证ACID,性能会大打折扣
三、Spring事务的传播特性(方便记忆)
支持
required 如果当前没有事务,就新建一个;如果当前存在,就加入当前事务
supports 支持当前事务,如果不存在,就不使用事务
mandatory 支持当前事务,如果不存在则抛出异常
不支持
requires_new 如果有事务存在,挂起当前事务,创建一个新的事务
not_supported 以非事务方式运行,如果事务存在,挂起当前事务
never 以非事务方式运行,如果事务存在,抛出异常
嵌套
nested 如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则执行required类似操作
四、 事务的4个基本特性:ACID(附加)
原子性(Atomicity):事务是一个原子操作,由一系列动作组成;事务的原子性确保动作要么全部完成,要么完全不起作用
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败;在现实中的数据不应该被破坏
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来;通常情况下,事务的结果被写到持久化存储器中