zoukankan      html  css  js  c++  java
  • spring 中事物的说明

    本文主要介绍spring中事务的annotation

    项目中某个功能20并发下响应时间为15ms,而期望指标为10ms。功能中包含9条sql,性能诊断初步定位在spring的事务处理上,耗时接近5ms,大致了解了下spring的Transactional配置含义。

    将propagation由Propagation.REQUIRES_NEW改为Propagation.REQUIRED响应时间也只提高了0.5ms。具体还在调优中

    以下是spring事务不同的annotation
    // 业务方法需要在一个事物中运行,如果方法运行时,已经存在一个事物中,
    // 那么加入该事物,否则为自己创建一个新事物。
    @Transactional(propagation = Propagation.REQUIRED)
    public void test1() {
    }
    
    // 声明方法不需要事务,如果方法没有关联到一个事务,容器不会为它开启事物。
    // 如果方法在一个事物中被调用,该事物会被挂起,在方法调用结束后,原先的
    // 事物便会恢复执行。
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void test2() {
    }
    
    // 表明不管是否存在事物,业务方法总会为自己发起一个新事物。
    // 如果方法已经运行在一个事物中,则原有事物会被挂起,
    // 新的事物会被创建,直到方法执行结束,新事物才算结束,
    // 原先的事务才会被恢复执行。
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void test3() {
    }
    
    // 该属性指定业务方法只能在一个已经存在的事物中执行,
    // 业务方法不能发起自己的事物,如果业务方法在没有事物的环境
    // 下调用,容器就会抛出异常。
    @Transactional(propagation = Propagation.MANDATORY)
    public void test4() {
    }
    
    // 这个事物属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事物的一部分,
    // 如果业务方法在事务范围外被调用,则方法在没有事物的环境下执行。
    @Transactional(propagation = Propagation.SUPPORTS)
    public void test5() {
    }
    
    // 指定业务方法绝对不能在事物范围内执行。如果业务方法在某个事物中执行,
    // 容器会抛出异常,只有业务方法没有关联到任何事物,才能正常执行。
    @Transactional(propagation = Propagation.NEVER)
    public void test6() {
    }
    
    // 如果一个活动的事物存在,则运行在一个嵌套的事物中,如果没有活动事物,
    // 则按REQUIRED属性执行,它使用了一个单独的事物,这个事物拥有多个回滚的保存点,
    // 内部事务的回滚不会对外事物造成影响,它只对DataSourceTransactionManager
    // 事务管理器起效。
    @Transactional(propagation = Propagation.NESTED)
    public void test7() {
    }
    
    @Transactional(isolation = Isolation.DEFAULT)
    public void test8() {
    }
    
    // 读已提交数据(会出现不可重复读和幻读)
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void test9() {
    }
    
    // 读未提交数据(会出现脏读、不可重复读和幻读)
    @Transactional(isolation = Isolation.READ_UNCOMMITTED)
    public void test10() {
    }
    
    // 可重复读(会出现幻读)
    @Transactional(isolation = Isolation.REPEATABLE_READ)
    public void test11() {
    }
    
    // 串行化
    @Transactional(isolation = Isolation.SERIALIZABLE)
    public void test12() {
    }
    
    // 抛出Exception异常时,记录回滚
    @Transactional(rollbackFor = Exception.class)
    public void test13() throws Exception {
    }
    
    // 抛出Exception异常时,记录不回滚
    @Transactional(noRollbackFor = Exception.class)
    public void test14() throws Exception {
    }

    其中部分名词解释:
  • 脏读:一个事物读取到另一个事物未提交的更新数据。
  • 不可重复读:在同一事物中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。
  • 可重复读:在同一事物中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。
  • 幻读:一个事务读取到另一事务提交的insert数据。

转载自http://www.cnblogs.com/xupei/archive/2011/01/07/1929632.html



已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



查看全文
  • 相关阅读:
    ResponsibleChain(责任链模式)
    IteratorPattern(迭代子模式)
    为什么抽象类不能实例化却有构造方法
    ObserverPattern(观察者模式)
    TemplateMethod(模块方法模式)
    java 定义一个同步map内存去重法
    oracle sql修改序列为当前序列开始
    oracle sql 当初始化数据时避免重复主键
    搭建基于express框架运行环境
    vue路由基础介绍
  • 原文地址:https://www.cnblogs.com/trinea/p/2550078.html
  • Copyright © 2011-2022 走看看