zoukankan      html  css  js  c++  java
  • spring事务学习笔记 全新时代

    事务  E:\HNHJ\java13\ibatis_template\doc\iBatis 学习笔记\IBATIS学习笔记(3) SQL Map XML配置文件 - 有时候,桔色的灯光下,一杯清茶,我们能分享很多! - 博客园.mht

    1. JDBC,通过传统JDBC Connection commit/rollback实现事务支持。
    2. JTA,使用容器提供的JTA服务实现事务管理
    3. EXTERNAL,外部事务管理,如在EJB中使用ibatis,通过EJB部署配置即可实现自动的事务管理机制,此时ibatis将把所有的事务委托给外部容器进行管理,此外,通过Spring等轻量级容器实现事务的配置化管理也是一个不错的选择。

    声明式事务。

    编程式事务。

    Spring注解方式

    Log4j,commons-logging

    <context:component-scan />  注解方便之处。

    注解配置生效:org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping 默认实现,可以不写,Spring容器默认会使用该类。

    Org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 直接关系到多动作控制器配置是否可用!

     

    序列化优点:对象需要进行网络传输,本地缓存,建议实现序列化接口。Serializable

     

    Service注入

    @Service

    @Transactional

    Public class AccountServiceImpl …{

           @Autowired

           Private AccountDao accountDao;

    }

    Dao注入

    @Repository

    Public class AccountDaoImpl …{

     

    }

     

    Spring声明式事务

    TransactionTemplate template = new TransactionTemplate(transactionManager);

    template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

    template.execute(new TransactionCallbackWithoutResult(){

           protected void doInTransactionWithoutResult(TransactionStatus status){

                  testDao.save(obj);

    }

    });

    //获取事务管理器

    PlatformTransactionManager txManager = (PlatformTransactionManager)ctx.getBean("

    txManager");

    //定义事务管理的模板

    TransactionTemplate transactionTemplate = new TransactionTemplate(txManager);

    //定义事务属性

    transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);

    //回调,执行真正的数据库操作,如果需要返回值需要在回调里返回

    transactionTemplate.execute(new TransactionCallback(){

           public Object doInTransaction(){

                  //执行数据库操作

                  System.out.println(jdbcTemplate.queryForInt("select count(*) from tbl_doc"));

                  return null;

           }

    });

    之前项目中应用的事务框架写法:

    1. 定义事务管理器bean <transactionManager> 关联dataSource
    2. 定义事务代理模板bean txProxyTemplate  关联三个部分:

    1.transactionManager,

    2.transactionAttributes (modify* ,PROPAGATION_REQUIRED, readOnly),

    3.service bean关联,

    <bean id="userService" parent="txProyTemplate">

    <property name="target">

    <bean class="xx.xx.UserServiceImpl">

    <property name="userDao" ref="userDao"/>

    </bean>

    </property>

    </bean>

     

    事务测试情形一

    Web层捕获异常并处理,DAO层不捕获异常,Service也不捕获异常。 èspring事务管理成功(封装DataAccessException异常逐层抛出)

    事务测试情形二

    Web捕获异常并处理,Service捕获异常并处理,DAO层不捕获异常。èService捕获异常并不向外抛出,web层捕获不到异常,Spring事务管理失败。

    事务测试情形三

    Web层捕获异常,Service捕获异常,DAO层也捕获异常。 èDAO层捕获异常,其他捕获不到,Spring事务管理失败。

     

     

    事务基础

    ACID特征

    隔离级别

    ISOLATION_DEFAULT: 默认隔离级别,即使用底层数据库默认的隔离级别。

    ISOLATION_READ_UNCOMMITTED: 未提交读(未授权读取)

    ISOLATION_READ_COMMITTED: 提交读,一般情况下我们使用这个(授权读取)

    ISOLATION_REPEATABLE_READ: 可重复读

    ISOLATION_SERIALIZABLE: 序列化

    传播行为(7种)

    1.Required:必须有逻辑事务。表示如果当前存在一个逻辑事务,则加入该逻辑事务,否则将新建一个逻辑事务。PROPAGATION_REQUIRED指定。

     

    因此userService对象的save方法和addressService的save方法属于同一个物理事务,如果发生回滚,则两者都回滚。

    2.RequiresNew:创建新的逻辑事务。PROPAGATION_REQUIRES_NEW指定。

     

    userService对象的save方法和addressService对象的save方法不属于同一个逻辑事务也不属于同一个物理事务。

    3.Supports支持当前事务,使用PROPAGATION_SUPPORTS指定。如果当前存在逻辑事务,就加入到该逻辑事务,否则以非事务方式执行。

     

    4.NotSupported:不支持事务。使用PROPAGATION_NOT_SUPPORTED指定。

     

    5.Mandatory:必须有事务,否则抛出异常,使用PROPAGATION_MANDATORY指定,使用当前事务执行,如果当前没有事务,则抛出iIllegalTransactionStateException

     

    6.Never:不支持事务,如果当前存在事务则抛出异常,使用PROPAGATION_NEVER指定,即以非事务方式执行,如果当前存在事务,则抛出异常illegalTransactionStateException

     

    7.Nested:嵌套事务支持。使用PROPAGATION_NESTED指定。如果当前存在事务,则在嵌套事务内执行,如果当前不存在事务,则创建一个新的事务,嵌套事务使用数据库中的保存点来实现,即嵌套事务回滚不影响外部事务,但外部事务回滚将导致嵌套事务回滚。

     

    事务超时, setTimeout(100)

    事务只读,将事务标示为只读,只读事务不修改任何数据。

    汇总:

    除了REQUIRED事务,spring中还有以下事务
           PROPAGATION_MANDATORY: 方法必须在一个现存的事务中进行,否则丢出异常
           PROPAGATION_NESTED: 在一个嵌入的事务中进行
           PROPAGATION_NEVER: 不应在事务中进行,如果有则丢异常
           PROPAGATION_NOT_SUPPORTED: 不应再事务中进行,如果有就暂停现存的事务
           PROPAGATION_REQUIRED: 支持现在的事务,如果没有就建立一个新的事务
           PROPAGATION_REQUIRES_NEW: 建立一个新的事务,如果现存一个事务就暂停它
           PROPAGATION_SUPPORTS: 支持现在的事务,如果没有就以非事务的方式执行

    --http://dannyfk221.iteye.com/blog/1692271—

     

    MySQL相关

    要使用MySQL数据库进行事务处理,必须建立支持事务的表格类型,例如InnoDB的表格类型。

    Create table user(

     Id  int(11)  not null auto_increment primary key,

     Name  varchar(100)  not null  default ' ';

     Age int

    )type = InnoDB;

  • 相关阅读:
    Go通过闭包避免程序运行崩溃
    占个坑
    Go多核并行
    一个计划
    python入门:模拟简单用户登录(自写)
    python入门:if、elif、else 条件语句的基本用法
    python入门:if和else的基本用法
    python入门:print打印输出的用法
    python入门:最基本的用户登录
    Python入门:Python基础笔记
  • 原文地址:https://www.cnblogs.com/simpledev/p/3059929.html
Copyright © 2011-2022 走看看