Spring-事务管理

Spring事务是如何进行管理的?基于这个问题,分别从以下几个方面来说明

1、数据库事务的特性ACID

2、由于事务的隔离级别会导致那些问题

3、Spring事务的处理方式

4、Spring事务的传播特性

5、Spring事务的隔离级别

 

1、数据库事务的ACID特性

A(Atomic):原子性、指事务是一个不可分割的整体,要么全做,要么全不做

C(Consistent):一致性、指事务必须使数据库从一个一致性状态变到另一个一致性状态

I(Isolated):隔离性、指事务之间的执行互不干扰

D(Durable):持久性、指事务一旦提交,对数据的改变就将是永久性的

 

2、事务隔离级别导致可能出现的问题

由于事务可能并发执行,即个事务之间可能会相互干扰,可能出现以下问题:

a、脏读:指一个事务读取的另一个事务更改但为提交的数据,如果这些数据被回滚了,则第一个事务读到的数据就是无效的

b、不可重复读:指一个事务指定相同的查询两次货以上,但是每次的查询结果不同,主要原因是因为另外一个事务在几次查询之间做的更新操作

c、幻读:指一个事务在几次读取数据时,结果不一致,主要原因是因为另外一个事务在几次查询之间做了新增或者删除操作

注意不可重复读和幻读的区别,前者是因为更新,后者是因为新增或者删除。

 

3、Spring事务的处理方式

事务的处理方式一般分为编程式事务处理或者声明式事务处理,编程式事务处理对代码的侵入性较强,事务处理代码与业务耦合较紧密。Spring提倡低耦合,即声明式事务管理,主要通过AOP的思想,将事务切入到业务代码,通过拦截方法,在方法执行前开启事务,在方法执行完之后执行提交或者回滚,但是这样导致事务控制的粒度只能是方法级别的。

 

4、Spring事务传播特性

事务传播特性主要指事务之间如何相互影响,Spring中TransactionDefinition提供了7种事务传播特性,分贝如下:

PROPAGATION_REQUIRED:如果当前么有事务则新建事务;如果事务已经存在,则加入到已经存在的事务中

PROPAGATION_REQUIRES_NEW:新建事务,如果当前事务存在,则挂起当前事务

PROPAGATION_SUPPORTS:加入当前事务,如果当前没事务,则以非事务方式执行

PROPAGATION_MANDATORY:加入当前事务,如果当前没事务,则抛出异常

PROPAGATION_NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则挂起当前事务

PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常

PROPAGATION_NESTED:如果当前事务存在,则嵌套在当前事务执行,如果当前没有事务,则新建一个事务并执行

 

5、Spring事务隔离级别

Spring事务支持一下5种隔离级别:

1) DEFAULT (默认)
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。

2) READ_UNCOMMITTED (读未提交)
这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。

3) READ_COMMITTED (读已提交)
保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

4) REPEATABLE_READ (可重复读)
这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。

5) SERIALIZABLE(串行化)
这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。

 

常见数据库的事务隔离级别:MySQL默认是REPEATABLE_READ;Oracle和Sql Server默认是READ_COMMITTED 

 

上一篇:将r值绑定到l值引用是非标准Microsoft C扩展


下一篇:如何开发一个Node脚手架