Spring的学习(四)

Spring的学习(四)

所有的设置在最下面的spring.xml

1.事务

事务管理是企业级应用程序开发中必不可少的技术, 用来确保数据的完整性和一致性.
事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用
事务的四个关键属性(ACID)

原子性(atomicity): 事务是一个原子操作, 由一系列动作组成. 事务的原子性确保动作要么全部完成要么完全不起作用.
一致性(consistency): 一旦所有事务动作完成, 事务就被提交. 数据和资源就处于一种满足业务规则的一致性状态中.
隔离性(isolation): 可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来, 防止数据损坏.
持久性(durability): 一旦事务完成, 无论发生什么系统错误, 它的结果都不应该受到影响. 通常情况下,
事务的结果被写到持久化存储器中

2.spring中的事务管理器的不同实现

实现方式共有两种:编码方式;声明式事务管理方式。
基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后在目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务。
声明式事务管理又有两种方式:基于XML配置文件的方式(本文的配置方式);另一个是在业务方法上进行@Transactional注解,将事务规则应用到业务逻辑中。

3.事务传播属性

当事务方法被另一个事务方法调用时, 必须指定事务应该如何传播. 例如: 方法可能继续在现有事务中运行, 也可能开启一个新事务, 并在自己的事务中运行.
事务的传播行为可以由传播属性指定. Spring 定义了 7 种类传播行为.
这里写图片描述

4.事务的隔离级别

从理论上来说, 事务应该彼此完全隔离, 以避免并发事务所导致的问题. 然而, 那样会对性能产生极大的影响, 因为事务必须按顺序运行.
在实际开发中, 为了提升性能, 事务会以较低的隔离级别运行.
事务的隔离级别可以通过隔离事务属性指定

脏读   脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。(读到未提交的数据)
不可重复读 不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。(读到被修改的数据)
虚读(幻读)   幻读是事务非独立执行时发生的一种现象。(读到新添加的数据)

5.超时和只读属性

由于事务可以在行和表上获得锁,  因此长事务会占用资源, 并对整体性能产生影响. 
如果一个事务只读取数据但不做修改, 数据库引擎可以对这个事务进行优化. 

超时事务属性: 事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源.
只读事务属性: 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务.

6.遇到的问题


Bean named 'countryService' must be of type [com.longge.service.imp.CountryService], but was actually of type [$Proxy9]异常:

  <font color=red>AOP编程中有两种代理技术:jdk代理和CGLIB代理。
       AOP中,当你通过代理对象去实现AOP技术时获取的ProxyFactoryBean是动态代理对象,如果目标对象实现了接口,则spring使用jdk的动态代理技术去完成,如果没有实现接口,则spring使用CGLIB技术去完成。
所以在spring.xml 配置中加上   
<aop:aspectj-autoproxy proxy-target-class="true"/>
即可。

7.Spring.xml代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
    ">
    <context:component-scan base-package="lesson4"></context:component-scan>

    <context:property-placeholder location="classpath:lesson4/jdbc.properties"/>
        <!-- 数据源获取连接 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="url" value="${url}"></property>
        <property name="username" value="${username1}"></property>
        <property name="password" value="${password}"></property>
        <property name="driverClassName" value="${driverClass}"></property>
    </bean> 
    <!-- 创建模板,模板封装了操作数据的常用方法 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!-- 注入数据源 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 事务管理器 不再使用jdbc的commit和rollback必须使用-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据源 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 定义事务管理器的通知  transaction-manager关联事务管理器-->
    <tx:advice id="idAdvies" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 只读所有方法read-only -->
            <tx:method name="*" read-only="true"/>
            <!-- 除了以下方法 -->
            <!-- 
                propagation方法和方法之间的父子关系
                REQUIRED 没有事务创建一个事务,有事务使用使用当前事务
                REQUIRED_NEW 不管父方法是否存在事务 都会新建事务
                SUPPORTS 如果父方法存在事务 使用当前事务 没有事务 使用jdbc的事务(自动提交)
                NOT_SUPPORTED 不敢父方法是否存在事务 都不会使用事务
                MANDATORY 父方法必须有事务  如果没有抛出异常
                NEVER 父方法必须没有事务  如果有抛出异常   

                isolation设置隔离级别
                DEFAULT(默认)  使用数据库本身的隔离级别 ORACLE(读已提交) MYSQL(可重复读)
                READ_UNCOMMITTED spring实现读未提交(脏读)
                READ_COMMITTED spring实现读已提交(不可重复读、幻读)
                REPEATABLE_READ spring实现可重复读(幻读)
                SERIALIZABLE   spring实现串行化 (最安全)

                spring事务运行过程中,默认碰到运行时异常自动回滚
                rollback-for 指定会回滚的非运行时异常
                no-rollback-for 指定部部会回滚的运行时异常

                超时事务:timeout(10s-30s)  mysql默认10s超时,oracle永不超时
             -->
            <tx:method name="update*" propagation="REQUIRES" isolation="DEFAULT" rollback-for="java.lang.Exception" timeout="10"/>
        </tx:attributes>    
    </tx:advice>
    <!-- 配置aop -->
     <aop:aspectj-autoproxy proxy-target-class="true"/>
    <aop:config>
            <!-- 配置切点(应该拦截service层) -->
            <aop:pointcut expression="execution(* lesson4.dao.*.*(..))" id="myPoint"/>
            <!-- 关联事务管理器的通知 -->
            <aop:advisor advice-ref="idAdvies" pointcut-ref="myPoint"/>
        </aop:config>
 </beans>
补充:
    开发环境maven(jar包)
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.spring</groupId>
    <artifactId>spring</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>
            <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.3.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.bundles</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8_2</version>
        </dependency>
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
    </dependencies>
</project>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值