事务的使用

事务的特性 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 属性执行

 

你可能感兴趣的:(事务的使用)