码迷,mamicode.com
首页 > 编程语言 > 详细

Spring003--Spring事务管理(mooc)

时间:2018-05-26 18:46:45      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:--   相关   status   接口   连接数据库   通过   require   因此   service   

Spring事务管理

一。事务回顾

1.1。什么是事务

       事务指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败。

技术分享图片

异常情况发生,需要保证:【1】张三将钱转出,李四收到钱。【2】张三钱未成功转出,李四也未收到钱。

1.2。事务特性

事务有4大特性:原子性,一致性,隔离性,持久性。

1.2.1。原子性

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

//物理中强调原子是最小单位,不可分割。如张三向李四转钱,张三转出与李四转入这一组操作具有原子性,不可分割。

1.2.2。一致性

 一致性指事务前后数据的完整性必须保持一致。

如:张三有2000元,李四有2000元。共计4000元。张三向李四转1000元,无论转账成功与否,合计一定要为4000元。保证数据前后一致性

1.2.3。隔离性

隔离性指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。

技术分享图片

如上图所示:事务A修改了张三的账户记录,此时事务B也修改张三的账户。此时会出现问题:重复修改或是事务A的修改被事务B覆盖。

所以需要保证事务A不受事务B干扰。

解决方案:数据库都会设置一些事务的隔离级别,可通过数据库的事务隔离级别控制一个事务不被另一个事务所干扰。

1.2.4。持久性

持久性是指一个事务一旦被提交,它对数据库数据的改变就是永久性的,即使数据库发生故障也不应该对其有任何影响。

二。Spring事务管理的一组API

2.1。Spring接口

技术分享图片

以上,PlatformTransactionManager事务管理器是用来真正管理事务的一个接口。它里面包含了像事务的提交,回滚等信息。

事务管理器 & 事务定义信息 & 事务具体运行状态之间是有联系的:

技术分享图片

2.2。PlatformTransactionManager接口(平台事务管理器)

Spring为不同的持久层框架提供了不同的PlatformTransactionManager接口实现

技术分享图片

2.3。TransactionDefinition定义事务隔离级别(隔离,传播,超时,只读)isolation

若不考虑事务隔离性,会引发安全问题如下:

1。脏读:

   一个事务读取了另一个事务改写但还未提交的数据。如果这些数据被回滚,则读到的数据是无效的。导致查询结果不一致。

2。不可重复读:

   一个事务读取了另一个事务改写又提交的数据,导致多次读取同一数据返回的结果有所不同。

3。幻读/虚读:

   一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。

隔离级别就是用来解决脏读,不可重复读及幻读问题的。

事务的4种隔离级别:级别低-》高(READ_UNCOMMITED->SERIALIZABLE)

技术分享图片

注意:SERIALIZABLE是串行的,不可能出现并发情况。因此不会发生脏读,不可重复读及幻读情况。

Spring提供default默认隔离级别,即数据库用什么隔离级别,default就是什么隔离级别。

   mysql默认采用REPEATABLE_READ隔离级别

   oracle默认采用READ_COMMITED隔离级别

 2.4。TransactionDefinition定义事务的传播行为(隔离,传播,超时,只读)

1。什么是事务的传播(propagation)行为?

事务的传播行为主要用来解决一些问题,

技术分享图片

此时出现一个复杂情况:调用Service1.aaa()与Service2.bbb()才能够完成一个业务。

此时Service1.aaa()&Service2.bbb()均有事务,那么事务应用哪个?应用事务的传播行为。

事务的传播行为:用于解决业务层方法之间的调用,事务是如何进行传递的。

2。事务的7种传播行为(3类,重点记第1个)

技术分享图片

 

说明:

1。PROPAGATION_REQUIRED:支持当前事务,如果存在,则用当前事务,不存在,则创建一个新的事务。

如上Service1.aaa()与Service2.bbb()。若Service2.bbb()定义传播行为是PROPAGATION_REQUIRED,

当Service1.aaa()有事务,则Service2.bbb()使用Service1.aaa()事务。即它们在同一事务中。要么均执行成功,要么均回滚。

当Service1.aaa()没有事务,则Service2.bbb()会创建一个新的事务。则Service2.bbb()事务回滚不会影响Service1.aaa

以下三种事务为同一组事务类型:

PROPAGATION_REQUIRED:支持当前事务,如果不存在则创建一个。

PROPAGATION_SUPPORTS:支持当前事务,如果不存在,则不使用事务。

PROPAGATION_MANDATORY:支持当前事务,如果不存在,则抛出异常。

相同点:

均为支持当前事务,即如果Service1.aaa有事务,则使用Service1.aaa的事务。

不同点:

PROPAGATION_REQUIRED:当Service1.aaa没有事务时,则新创建一个事务。

PROPAGATION_SUPPORTS:当Service1.aaa没有事务时,则不使用事务(即始Service.bbb有事务也不生效)。

PROPAGATION_MANDATORY:当Service1.aaa没有事务时,则抛出异常。

2。PROPAGATION_REQUIRES_NEW:如果有事务存在,则挂起当前事务,创建一个新的事务。

如上Service1.aaa()与Service2.bbb()。若Service2.bbb()定义传播行为是PROPAGATION_REQUIRES_NEW,

当Service1.aaa()有事务,则Service1.aaa事务会被挂起,Service2.bbb会新起一个事务。即它们不在同一事务中。

以下三种事务为同一组事务类型:

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

PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 

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

相同点:

嵌套的方法均不在同一个事务中,若当前(Service1.aaa)存在事务,则将该事务挂起。

不同点:

PROPAGATION_REQUIRES_NEW:创建一个新的事务。(Service2.bbb创建一个新的事务)

PROPAGATION_NOT_SUPPORTED:不使用事务。(Service2.bbb不使用事务)

PROPAGATION_NEVER:抛出异常。(Service2.bbb抛出异常)

3。PROPAGATION_NESTED:如果当前事务存在,则嵌套事务执行(复杂)

当Service1.aaa()有事务时,执行完Service1.aaa()时,会使用事务设置一个保存点(savepoint)。再执行Service2.bbb()时,若没有异常,则一起提交,

若有异常,则根据自定义设置,可以回滚到事务保存点,也可以回滚到最初始状态。可自己控制。

2.3。TransactionStatus接口(事务状态)

三。转账环境搭建

3.1。Spring支持两种方式事务管理:

1。编程式的事务管理

    (1)。在实际应用中很少使用。

    (2)。通过TransactionTemplate手动管理事务

2。使用XML配置声明式事务

     (1)。开发中推荐使用(代码侵入性最小)

     (2)。Spring的声明式事务是通过AOP实现的。

3.2。转账环境准备

1。数据库准备

技术分享图片

2。创建Web项目

引入相应的JAR包及配置文件。

JAR包:

(1)。连接数据库需要引入数据库驱动包,连接池(c3p0)相关JAR包。

(2)。Spring相关jar包

(3)。日志包

配置文件:

(1)。log4j.properties:日志记录

(2)。jdbc.properties:数据库连接配置文件

(3)。applicationContext.xml:Spring核心文件

创建package,写业务逻辑:

(1)定义interface/AccountService:业务层接口

技术分享图片

(2)定义实现类/AccountServiceImpl:业务层实现类,调用DAO层

 技术分享图片

(3)操作数据库Dao层接口

技术分享图片

(4)DAO层接口实现类

技术分享图片

(5)Spring完成一些相关配置

      【1】。连接数据库(引入外部属性文件)& c3p0连接池

技术分享图片

     【2】配置业务层类

技术分享图片

     【3】配置DAO类:在DAO里面直接注入连接池即可。只要给它创建连接池,它就会为我们创建JDBC的模版。

            此时即可以在Dao的实现类中进行编写,操作数据库。

技术分享图片

 

(6)创建测试类 

技术分享图片

模拟service实现类异常,依然写入成功。扣钱与加钱操作应在同一个事务中。需要进行相应的事务管理。

技术分享图片

 

 

 

 

 

 

 

 

四。Spring的编程式事务管理

五。Spring的声明式事务管理

 

Spring003--Spring事务管理(mooc)

标签:--   相关   status   接口   连接数据库   通过   require   因此   service   

原文地址:https://www.cnblogs.com/kaixinyufeng/p/9093810.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!