事务的特性、隔离级别、传播特性

1、事务的基本要素(ACID)(特性)数据库

  一、原子性(Atomicity):事务开始后全部操做,要么所有作完,要么所有不作,不可能停滞在中间环节。事务执行过程当中出错,会回滚到事务开始前的状态,全部的操做就像没有发生同样。也就是说事务是一个不可分割的总体,就像化学中学过的原子,是物质构成的基本单位。并发

   二、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。好比A向B转帐,不可能A扣了钱,B却没收到。 高并发

   三、隔离性(Isolation):同一时间,只容许一个事务请求同一数据,不一样的事务之间彼此没有任何干扰。好比A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转帐。spa

   四、持久性(Durability):事务完成后,事务对数据库的全部更新将被保存到数据库,不能回滚。事务

并发下事务会产生的问题ci

举个例子,事务A和事务B操纵的是同一个资源,事务A有若干个子事务,事务B也有若干个子事务,事务A和事务B在高并发的状况下,会出现各类各样的问题。"各类各样的问题",总结一下主要就是五种:第一类丢失更新、第二类丢失更新、脏读、不可重复读、幻读。五种之中,第一类丢失更新、第二类丢失更新不重要,不讲了,讲一下脏读、不可重复读和幻读。资源

一、脏读it

所谓脏读,就是指事务A读到了事务B尚未提交的数据好比银行取钱,事务A开启事务,此时切换到事务B,事务B开启事务-->取走100元,此时切换回事务A,事务A读取的确定是数据库里面的原始数据,由于事务B取走了100块钱,并无提交,数据库里面的帐务余额确定仍是原始余额,这就是脏读。io

二、不可重复读table

所谓不可重复读,就是指在一个事务里面读取了两次某个数据,读出来的数据不一致仍是以银行取钱为例,事务A开启事务-->查出银行卡余额为1000元,此时切换到事务B事务B开启事务-->事务B取走100元-->提交,数据库里面余额变为900元,此时切换回事务A,事务A再查一次查出帐户余额为900元,这样对事务A而言,在同一个事务内两次读取帐户余额数据不一致,这就是不可重复读。

三、幻读

所谓幻读,就是指在一个事务里面的操做中发现了未被操做的数据好比学生信息,事务A开启事务-->修改全部学生当天签到情况为false,此时切换到事务B,事务B开启事务-->事务B插入了一条学生数据,此时切换回事务A,事务A提交的时候发现了一条本身没有修改过的数据,这就是幻读,就好像发生了幻觉同样。幻读出现的前提是并发的事务中有事务发生了插入、删除操做。

2、MySQL事务隔离级别(隔离级别)

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

 

 

 

 

 

 

 

3、Spring中七种Propagation类的事务属性详解(传播特性):

REQUIRED:支持当前事务,若是当前没有事务,就新建一个事务。这是最多见的选择。 

SUPPORTS:支持当前事务,若是当前没有事务,就以非事务方式执行。 

MANDATORY:支持当前事务,若是当前没有事务,就抛出异常。 

REQUIRES_NEW:新建事务,若是当前存在事务,把当前事务挂起。 

NOT_SUPPORTED:以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。 

NEVER:以非事务方式执行,若是当前存在事务,则抛出异常。 

NESTED:支持当前事务,若是当前事务存在,则执行一个嵌套事务,若是当前没有事务,就新建一个事务。 

相关文章
相关标签/搜索