Document

Spring支持的常用数据库事务传播属性和隔离级别

  事务的属性:

  1.propagation:用来设置事务的传播行为

  事务的传播行为:一个方法运行在了一个开启了事务的方法中时,当前方法是使用原来的事务还是开启一个新的事务。

  propagation=Propagation.REQUIRED:默认值,使用原来的事务

  propagation=Propagation.REQUIRES_NEW:将原来的事务挂起,开启新的事务

  2.isolation:用来设置事务的隔离级别

  isolation=Isolation.REPEATABLE_READ:可重复读,MySQL的默认隔离级别

  isolation=Isolation.READ_COMMITTED:读已提交,oralce的默认隔离级别,开发时通常使用的隔离级别。

1.事务的传播属性 

 当前事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。

  事物的传播行为可以由传播属性指定。Spring定义了7种类传播行为。

  

其中前4种是开发中用到概率比较大的,建议熟记;后面3种不常用,了解就行。

我们经常会提到,方法A传播到方法B,显而易见进入A方法执行半途中,再次进入B方法,这才叫做传播到方法B中。

2.数据库事务并发问题

假设现在有两个事务:transaction01和transaction02并发执行

脏读:在一个事务中读取到另一个事务没有提交的数据 。

  transaction01将某条记录的age值从20修改为30;

  transaction02读取了transaction01更新后的值:30;

  transaction01回滚,age值恢复到20;

  transaction02读取到的30就是一个无效值。

不可重复读:在一个事务中,两次查询的结果不一致(针对的update操作)

  transaction01读取了age值:20;

  transaction02将age值修改为30;

  transaction01再次读取age值为30,和第一次读取不一致。

虚读(幻读):在一个事务中,两次查询的结果不一致(针对的insert操作)

  transaction01读取了student表中的一部分数据;

  transaction02向表中插入了新的行;

  transaction01读取了student表时,多出了一些行。

 3.隔离级别

  数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。一个事务与其他事务隔离的程度称为隔离级别。SQL标准中规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性越好,但并发性越弱。

1,Read uncommitted(读未提交):最低级别,以上情况均无法保证

  允许transaction01读取transaction02未提交的修改。(脏读避免不了)

2. Read committed(读已提交):可避免脏读情况发生(读取已经提交)

   要求transaction01只能读取transaction02已提交的修改。

3. Repeatable read(可重复读):可避免脏读,不可重复读情况发生。

   确保transaction01可以多次从一个字段中读取到相同的值,即transaction01执行期间禁止其它事务对这个字段进行更新。

4.serializable(可串行化):可避免脏读,不可重复读,虚读情况发生,但性能较差。

  确保transaction01可以多次从一个表中读取到相同的行,在transaction01执行期间,禁止其它事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。
 

 

posted @ 2020-02-10 13:28  马宝云  阅读(421)  评论(0编辑  收藏  举报