事务的特性 ACID
A:原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
C: 一致性(Consistency)事务前后数据的完整性必须保持一致。
I:隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
D:持久性(Durability)持久性是指一个事务一旦被提交
MySql默认的隔离级别为Repeatable Read,
事务并发问题
脏读:一个事务读取到了另外一个事务没有提交的数据 (即为在内存中的数据)
幻度:在同一事务中,两次读取同一数据,得到内容不同 (幻读 :不是针对一条数据,而是多条数据的 幻读针对的是insert)
{ 事务1:查询表中所有记录
-------------->事务2:插入一条记录
-------------->事务2:调用commit进行提交
事务1:再次查询表中所有记录
}
不可重复读:在同一事务中,两次读取同一数据,得到内容不同 (针对一条数据 不可重复读针对的是update/delete,)
{ 事务1:查询一条记录
-------------->事务2:更新事务1查询的记录
-------------->事务2:调用commit进行提交
事务1:再次查询上次的记录
}
事务隔离级别
读未提交:可以读到其他事物未提交的事务(出现脏读)
读写提交: 指一个事务只能读取到另外一个事务已经提交的数据。(克服了脏读) 写数据只会锁住相应的行
可重复读: 克服读写提交中出现的不可复读的现象,因为在读写提交的时候,可能出现一些值的变化,影响当前事务的执行。(克服了不可重复读)
串行化: 最高的隔离级别,会要求所有的SQL按照顺序执行,这样就可以克服上述隔离级别出现的问题,所以能够保证数据的一致性。(克服幻读)事务隔离级别为串行化时,读写数据都会锁住整张表
详细图解
https://blog.csdn.net/DorAction/article/details/87971378
不可重复读的重点是修改 :
同样的条件 , 你读取过的数据 , 再次读取出来发现值不一样了
幻读的重点在于新增或者删除
同样的条件 , 第 1 次和第 2 次读出来的记录数不一样
事务传播行为
PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。(默认)
PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。
PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。
PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常
PROPAGATION_NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行