spring(三) spring事务操作

      前面一篇博文讲解了什么是AOP。学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理。

                                      --wh

一、jdbcTemplate  

      什么是JdbcTemplate?

            spring提供用于操作数据库模版,类似Dbutils,通俗点讲,我们操作数据库,spring也会帮我们提供一个操作数据库的工具供我们使用,而不用我们自己手动编写连接数据库,获取结果集等等操作,这个工具就是JdbcTemplate。跟Dbutils一样,想要使用JdbcTemplate,就必须给他配置数据源。

      第一步:导包

              

      第二步:配置数据源,配置模版,给UserDao配置模版

          使用dbcp充当数据源

              

          使用c3p0充当数据源

              

      第三步:UserDao中使用JdbcTemplate

              

          但是spring为了让我们更方便,不用每次都写set方法和JdbcTemplate属性,给我们提供了一个类JdbcDaoSupport,我们只需要继承他,就可以直接获得jdbcTemplate了,因为JdbcDaoSupport中帮我们写了set方法

              

       第四步:使用JdbcTemplate API操作数据库

               update 进行 增删改操作

               queryForObject  查询一个

               query  查询所有

               queryForInt 查询一个整形(分页)

              

        第五步,测试 成功插入数据,其他的就不测了。

                    

        提升:使用properties 

              将连接数据的具体参数配合到properties文件,由spring加载properties,并在spring配置文件中使用  

              

二、事务的回顾

      如果一点都不清楚,看这篇博文,详细讲解了事务http://www.cnblogs.com/whgk/p/6182742.html

      事务:一组业务操作,要么全部成功,要么全部失败

      特性:ACID

         A:原子性,是说事务是一个整体,要么全部成功,要么全部失败

          C:一致性,数据完整,你转100给我,你减100,我要增加100

          I:隔离性,并发(多个事务)

          D:持久性,已经提交的事务,就已经保存到数据库中,不能在改变了

      隔离问题:

          脏读:读取到未提交的数据

          不可重复读:读取到已经提交的数据(update)

          虚度(幻读):读取到已经提交的数据(insert)

      解决隔离问题

          读未提交:存在三个问题。

          读已提交:存在两个问题,解决脏读问题(Oracle默认级别)

          可重复读:存在一个问题,解决脏读,不可重复读问题(Mysql默认级别)

          串行化:解决所有问题。

      而我们普通的程序要想使用事务的话,通过连接Connection来开启事务和关闭事务或者回滚,

              

三、spring如何进行事务的管理的理论分析

     PlatformTransactionManager:事务平台管理器。

           spring管理事务时,必须使用平台事务管理器,它是一个接口,相当于定义一个spring使用事务的规范,也就是如果你想用spring来帮你管理事务,那么就必须遵循这个规范,spring也帮我们实现了一些常用的技术所需要的管理器,比如,jdbc有jdbc管理器,hibernate有hibernate管理器,他们都是实现spring中的PlatformTransactionManager接口的。

              

          jdbc事务管理器:DataSourceTransactionManager

          hibernate事务管理器:HibernateTransactionManager

      PlatformTransactionManager是一个接口,那我们看它定义了哪些方法供我们使用的。

                  

         TransactionStatus getTransaction(TransactionDefinition);

                获取事务,参数TransactionDefinition(事务详情),该参数是需要我们配置的,通过我们配置的内容才能知道事务如何去处理。这个下面会详解

         commit(TransactionStatus);

                根据状态来提交事务的操作

         rollback(TransactionStatus);

                根据状态来回滚事务的操作

      TransactionStatus

          spring使用管理器,通过状态对事务进行管理(操作),我们不必关心这个,因为这是spring内部操作的事情,但是我们可以了解一下有哪些方法

              

      TransactionDefinition

           spring管理器必须通过"事务详情"的设置,获取相应的事务,从而进行事务管理。这里这个很重要,我们需要配置这个

               

           设置4个隔离级别就不用说了把,跟上面我们说的是一样的。解决隔离问题的四种级别。

           传播行为:一个业务A,一个业务B,AB如何共享事务,不同传播行为共享方案不同。 

                什么意思呢?比如业务A为银行转账的业务。 业务B为转完账发短信的业务,平常我们是转完钱,那么我们就需要收到短信说我们的账户上被转走多少钱,而收钱的那一方则需要收到短信说账户被转进多少钱,那么这两个业务是使用同一个事务呢?还是分别使用不同的事务,也就是如果是使用同一个事务的话,我们转钱成功了代表业务A成功了,但是业务B发送短信时出现问题,则说明该事务失败,那么刚才转的钱就算不成功,需要回滚,但是实际生活中,是不能这样的,转钱成功了,短信没发送成功,那么短信在重新发送一次即可。不需要让业务A重新在操作一遍。这就是业务A和业务B共享事务的解决方法,让他们两个使用各自的事务。而传播行为就是提供这样的共享方案的属性。

           传播行为方案               

                1.PROPAGATION_REQUIRED ,required ,必须使用事务  (默认值)

                         A 如果使用事务,B 使用同一个事务。(支持当前事务)

                        A 如果没有事务,B将创建一个新事务。

                2.PROPAGATION_SUPPORTS,supports ,支持事务

                         A 如果使用事务,B 使用同一个事务。(支持当前事务)

                         A 如果没有事务,B 将以非事务执行。

                3.PROPAGATION_MANDATORY,mandatory 强制

                         A 如果使用事务,B 使用同一个事务。(支持当前事务)

                         A 如果没有事务,B 抛异常

                4.PROPAGATION_REQUIRES_NEW , requires_new ,必须是新事务

                        A 如果使用事务,B将A的事务挂起,再创建新的。

                         A 如果没有事务,B将创建一个新事务

                5.PROPAGATION_NOT_SUPPORTED ,not_supported 不支持事务

                         A 如果使用事务,B将A的事务挂起,以非事务执行

                       A 如果没有事务,B 以非事务执行

                6.PROPAGATION_NEVER,never 从不使用

                         A 如果使用事务,B 抛异常

                        A 如果没有事务,B 以非事务执行

                7.PROPAGATION_NESTED nested 嵌套

                        A 如果使用事务,B将采用嵌套事务。

                        嵌套事务底层使用Savepoint 设置保存点,将一个事务,相当于拆分多个。比如业务A为AB两个曹祖,业务B为CD两个操作,业务AB使用同一个事务,在AB (POINT) CD,当业务B失败时,回滚到POINT处,从而业务A还是成功的,就是保持点的操作。

                         底层使用嵌套try方式

   

                掌握:PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEWPROPAGATION_NESTED

         总结:

                spring事务编程的步骤

                1、确定管理器

                2、必须配置事务详情(是否只读,隔离级别,传播行为等)

              配置好了事务详情,也确定了使用哪个管理器,那么spring就知道如何对事务进行怎样的处理了。

四、spring使用AOP技术来进行事务操作(基于xml)

        上面我们知道了spring使用事务需要哪些东西,但是单纯的使用上面这些编写事务,那我们对每个需要使用事务的方法都需要写代码,岂不是累死,但是结合前面学习的AOP思想,就简单很多了。

        重点看配置

              

        

        重点看47到59行的代码,配置事务管理器和事务详情,然后通过aop将我们的事务应用到指定的切入点上去,使用的是表达式。指定一个范围。其中,事务详情和事务管理器的结合就相当于通知(加强的方法),所以菜在通知引用上可以写上exAdvice。这点必须想清楚。也就是我们都不需要自己手动写什么开启事务等代码,spring全帮我们写好了,我们只需要配置一下事务详情即可。

        需要注意一点,如果没有使用接口,那么就需要写56行这行代码,如果使用了接口,那么就不需要写。之前不需要是因为我们自己手写的通知,不一样,可能对于事务这个来说,就必须写,这里我也没弄清楚,反正记住,如果事务进行代理的话,没有接口和有接口的处理方式不一样。

        事务详情的配置

              

          这样设置的话,就可以对不同的方法进行不同的事务处理了,很方便。比如add*,意思是add开头的方法,就使用传播行为为REQUIRED的事务进行处理,而find*,find开头的方法只能读,并且传播行为为REQUIRED。

五、spring使用AOP技术来进行事务操作(基于注解)

        超级简单。三步

        1、声明事务管理器

        2、将事务管理器交予spring

          前两步是在xml中写的

            

        3、在目标类或方法上 使用注解即可 @Transactional

            使用@Transactional(编写事务详情)

            

六、总结

      上面所写的aop的是使用spring默认的aop,并没有使用AspectJ框架,要区分清楚。并且今天这篇讲的是使用aop对事务进行管理。其实也就是通过aop对指定的方法进行加强,而加强的内容就是事务的内容,而事务的内容也是由spring帮我们做的,也就是通知也是spring帮我们写的,我们只需要通过配置事务管理器和事务详情即可。而前面一篇,所有的通知都是我们自己手动编写的,为的是体验aop的那种思想,这是不一样的。所以不要把自己给搞混了。

      第一篇博文:IOC(反转控制),在配置文件中配置bean,然后spring帮我们创建对象。默认就创建一个对象。singgton

      第二篇博文:AOP(面向切面编程),理解了AOP思想,和spring如何使用AOP技术,底层使用jdk和cglib进行代理,有接口使用jdk,没有接口可以使用cglib。掌握了spring内置的aop技术,还有一个AspectJ框架。要知道这两个是如何配置的,会使用AspectJ的注解和xml方式

      第三篇博文(本篇):AOP的应用(spring事务处理),spring帮我们将事务都已经写好了,我们只需要通过配置事务管理器,和事务详情(两者相当于通知了),然后使用spring内置的aop技术,将其在指定的方法上使用事务(相当于增强指定的方法),xml配置和注解两种方式。

      第四篇博文:整合SSH框架  

时间: 2024-10-14 16:03:09

spring(三) spring事务操作的相关文章

Spring(三)Spring三种实例化JavaBean的方式

Spring实例化JavaBean的方式有三种:使用类构造器实例化.使用静态工厂方法实例化.使用实例化工厂实例化 package test.spring.service; public interface PersonService { public abstract void save(); } package test.spring.service.impl; import test.spring.service.PersonService; public class PersonServi

如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作

Ibatis是MyBatis的前身,它是一个开源的持久层框架.它的核心是SqlMap--将实体Bean跟关系数据库进行映射,将业务代码和SQL语句的书写进行分开.Ibatis是"半自动化"的ORM持久层框架.这里的"半自动化"是相对Hibernate等提供了全面的数据库封装机制的"全自动化"ORM实现而言的,"全自动"ORM实现了POJO与数据库表字段之间的映射并且实现了SQL的自动生成和执行.而Ibatis的着力点,则在于P

spring学习(三) ———— spring事务操作

前面一篇博文讲解了什么是AOP.学会了写AOP的实现,但是并没有实际运用起来,这一篇博文就算是对AOP技术应用的进阶把,重点是事务的处理. --wh 一.jdbcTemplate 什么是JdbcTemplate? spring提供用于操作数据库模版,类似Dbutils,通俗点讲,我们操作数据库,spring也会帮我们提供一个操作数据库的工具供我们使用,而不用我们自己手动编写连接数据库,获取结果集等等操作,这个工具就是JdbcTemplate.跟Dbutils一样,想要使用JdbcTemplate

Spring框架深入(三)--事务

一.事务的概念 1.事务是什么 (1).作为单个逻辑工作单元执行的一系列操作(一组SQL会成为一个事务),是并发控制的单位,要么全部成功,要么全部失败 (2).如银行转账(需要两个update)/网上商城购物 2.事务的特征 (1).原子性:所有的操作会被看成一个逻辑单元,要么全部成功,要么全部失败 (2).一致性:事务在完成时,必须使所有的数据都保持一致状态,保证数据的完整性 (3).隔离性:与并发有关,事务之间的相互影响—隔离级别 (4).持久性:事务结束后,结果是可以固化的 二.事务隔离

spring的事务操作(重点)

这篇文章一起来回顾复习下spring的事务操作.事务是spring的重点, 也是面试的必问知识点之一. 说来这次面试期间,也问到了我,由于平时用到的比较少,也没有关注过这一块的东西,所以回答的不是特别好,所以借这一篇文章来回顾总结一下,有需要的朋友,也可以点赞收藏一下,复习一下这方面的知识,为年后的面试做准备. 首先,了解一下什么是事务? --- 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确

征服 Redis + Jedis + Spring (三)—— 列表操作【转】

一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 相关链接: 征服 Redis 征服 Redis + Jedis 征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL) 征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET) 征服 Redis + Jedis + Spring (三)—— 列表

spring(三)-事务管理

1. Spring事务管理 事务管理:本质是使用spring管理事务,完成数据库对于事务的支持. 事务:一系列对数据库操作的集合,一个操作错误,所有都必须回滚,其特点是acid. (1)事务并发存在问题: 脏读:事务读取数据无效.事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改. 不可重复读:一个事务范围内两个相同的查询却返回了不同数据.由于查询时系统中其他事务修改的提交而引起的.侧重对同一个数据的修改. 幻读:多个事务操作统一数据集.同样的条件, 由于事务T2的

Spring之事务操作(注解)

事务操作步骤: <!-- 第一步.配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <

Spring之事务操作(配置文件)

UserDao.java 1 package helloworld.tx; 2 3 import org.springframework.jdbc.core.JdbcTemplate; 4 5 public class UserDao { 6 7 private JdbcTemplate jdbcTemplate; 8 9 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 10 this.jdbcTemplate = jdbcTem