Loading

事务的四个特性、四种隔离级别和七种传播行为

一、事务的四个特性

1.1、什么是事务

事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);

1.2、事务的四个特性(ACID)

  1. 原子性(atomicity)操作一组指令,要么全部成功,要么不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
  2. 一致性(consistency):事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
  3. 隔离性(isolation)隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
  4. 持久性(durability)当事务正确完成后,它对于数据的改变是永久性的。例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

二、事务的四种隔离级别

2.1、事务的并发问题

 在看事务的隔离级别之前,先来来一下事务并发执行带来的问题:

1、脏读

脏读是指在一个事务处理过程中读取了其他未提交事务中的数据。例如你银行卡里有1000块钱,你的妻子打算买双500块钱的鞋子,她付钱的时候你查看银行卡余额为500元。这个时候,你妻子觉得太贵了不买了,撤销还没提交的操作,这个时候就发生了脏读。

2、不可重复读。

一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。例如,你银行卡有1000块钱,你查看余额剩下1000块钱,你打算买件衣服要800块钱,当你付钱的时候你妻子此时花费500块买了双鞋子,你付钱时发现余额不足。

脏读和不可重复读的差别:脏读读取的是未提交事务中的数据,不可重复读是读了已经提交了事务的数据。

3、幻读也叫虚读

一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。幻读是事务非独立执行时发生的一种现象。例如,你查看了你们这个月的消费账单,接着把账单打印出来,这个时候你的妻子又花500块钱买了条裙子,这个时候你打印出出账单一看,发现多了条买裙子的记录,好像出现了幻觉。

幻读和不可重复读都是读取了事务提交后的记录,但不可重复读读取的是更新操作的记录,幻读是读取了插入或者删除后的记录,这点要加以区分。

2.2、事务的隔离级别

事务的隔离级别有4种,由低到高分别为Read uncommitted(读未提交) 、Read committed(读已提交) 、Repeatable read (重复读)Serializable(序列化) 。而且,在事务的并发操作中可能会出现脏读不可重复读幻读。下面通过事例一一阐述它们的概念与联系。

1、Read uncommitted(读未提交

读未提交。顾名思义,一个事务可以读取另一个未提交事务的数据。读未提交是最低的隔离级别。

2、Read committed(读已提交

读已提交,也就是只能读取已经提交过事务的数据。这个隔离能够防止脏读的发生,但是不能防止不可重复读和幻读的发生。

3、Repeatable read (重复读)

重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。这个隔离级别能够防止脏读和不可重复读的发生,但是不能防止幻读的发生。

4、Serializable(序列化)

Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

总结:大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。

隔离级别的设置只对当前链接有效。对于使用MySQL命令窗口而言,一个窗口就相当于一个链接,当前窗口设置的隔离级别只对当前窗口中的事务有效;对于JDBC操作数据库来说,一个Connection对象相当于一个链接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他链接Connection对象无关。

设置数据库的隔离级别一定要是在开启事务之前。

三、事务的传播行为

Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的工具箱,使用事务传播行可以为我们的开发工作提供许多便利。但是人们对他的误解也颇多,你一定也听过“service方法事务最好不要嵌套”的传言。要想正确的使用工具首先需要了解工具。本文对七种事务传播行为做详细介绍,内容主要代码示例的方式呈现。

事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。

 

四、总结

本文主要对事务的特性、事务的隔离级别,和spring定义的事务传播行为做了介绍,希望对小伙伴们有帮助。

 

posted @ 2020-04-11 15:28  Charming-Boy  阅读(1352)  评论(0编辑  收藏  举报