春天事务管理原理及方法详解

  

这篇文章主要介绍了春天事务管理原理及方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  

事务,在日常开发或者面试中都必定会涉及到。开发工作中,结合数据库开发理解就是:一组dml要么全部成功执行提交,要么因为某一个操作异常,撤销之前所做的成功的操作,整体执行失败。再简单点的一句话:生死与共。

  

由此,可以看的出,事务的必要性:在开发工作中,保证操作数据的安全性。事务的控制也就是保证数据的访问安全性。

  

一、事务的四大特性
  

  

答:原子性(原子性),对数据的修改,要么全部成功执行,要么全部不执行。

  

C:一致性(一致性),一旦事务完成,系统必须保证数据职员是满足业务状态的一种一致状态中。很难懂的解释,跟原子性很像。一个事务在操作过程中,数据可能会产生很多中间态,一致性保证中间态对其他事务不可见,因为这些中间态,与事务的开始和结束的状态是不一致的。也就是从一种正确的状态到另一种正确的状态。

  

我:隔离性(隔离),事务之间的执行应不相互影响,也即事务执行的独立。

  

D:持久性(耐久性),事务一旦提交,则对数据库的修改是永久性的。

  

二、事务的隔离级别
  

  

并发环境下,事务可能会存在若干问题:脏读,幻读,不可重复读,第一类更新丢失,第二类更新丢失。

  

           类型   说明   举例         脏读   一个事务读取到了B事务未提交的数据   ,一个开启事务=祝辞;B开启事务,读取账户1000块,取走100块=在一个读取账户金额,读取到900=祝辞B回滚事务。此一读时取的余额数据是无效的         幻读   ,一个事务里面的操作发现了未被操作的数据      

,一个开启事务,修改某些数据状态=祝辞;B开启事务,执行新增数据并提交=祝辞;一个事务提交,会出现一条未被修改的数据。

  

幻读发生的前提是并发事务中发生了新增或者删除动作。

           不可重复读   ,一个事务中,先后两次读取数据,读到的结果不一致      

,一个开启事务,读取账户1000块=祝辞B开启事务,读取账户1000块,取出100块并提交事务=祝辞;一个再读取账户余额,余额900块。

  

一个事务范围内的两次同样的查询,却返回了两次不同的数据,这就是不可重复读

           第一类更新丢失   一个事务撤销,把已经提交的B事务的更新的数据覆盖   一个开启事务,读取账户1000块=祝辞B开启事务,读取账户1000块,然后增加100块,提交事务,账户变为1100=祝辞一撤销回滚事务,账户成1000块         第二类更新丢失   一个事务提交,把已经提交的B事务的更新的数据覆盖   一个开启事务,读取账户1000块=祝辞B开启事务,读取账户1000块,然后增加100块,提交事务,账户变为1100=祝辞的增加100块,提交事务,账户变为1100。            

  

针对并发环境下可能出现的事务问题,于是就出现了隔离级别的解决方案,由低到高依次是:读未提交(未提交读),读已提交(承诺),可重复读(可重复读),串行序列化(序列化)。下表展示出不同的隔离级别,对于脏读,幻读,不可重复读是否会出现。

  

           类型   脏读   不可重复读   幻读   说明         读未提交   会   会   会   ,         读过承诺   不会   会   会   ,         可重复读取   不会   不会   会   mysql的默认隔离级别         可序列化的   不会   不会   不会   最严格的隔离级别,将事务串行化执行,性能低。            

  

mysql中查询当前隔离级别:选择@@tx_isolation;

  

三,春天事务支持的隔离级别和传播特性
  

  

春天中定义了五种隔离界别和七种传播行为(可以在org.springframework.transaction.TransactionDefinition类中看到详细的解释)

  

1,弹簧支持的隔离级别
  

  

ISOLATION_DEFAULT:默认级别。一般是使用的是数据库本身的隔离级别(mysql——可重复读,oracle -读承诺)

  

余下ISOLATION_READ_UNCOMMITTED、ISOLATION_READ_COMMITTED ISOLATION_REPEATABLE_READ, ISOLATION_SERIALIZABLE分别对应上述数据库隔离级别配置。

春天事务管理原理及方法详解