zoukankan      html  css  js  c++  java
  • @transactional注解在什么情况下会失效,为什么。

    @transactional注解在什么情况下会失效,为什么。

    @Transactional的使用:

    @Transactional
    public void updateUserAndAccount(String user) {
        dao1.updateUserAccount();
        dao2.updateAccountAmount()
    }
    

    在xml中配置spring事务管理类DataSourceTransactionManager

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dynamicDataSource"></property>
    </bean>
    <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true" />
    

    调用含注解的方法并抛异常,执行有异常抛出,z1表新增记录、z2表无新增记录,事务失效

    public void testTransaction() {
        testTransaction3();
    }
    @Transactional
    public void testTransaction3() {
        db.update("insert into z1(c1) values('2')");
        // 测试
        String str = null;
        if (str.startsWith("111")) {
            db.update("insert into z1(c1) values('adff2')");
        }
    }
    

    修改后:

    @Transactional
    public void testTransaction() {
        db.update("insert into z1(c1) values('2')");
        testTransaction2();
    }
    public void testTransaction2() {
        // 主动抛出异常 测试回滚
        String str = null;
        if (str.startsWith("111")) {
            db.update("insert into z2(c1,c2) values('2','3')");
        }
    }
    

    在代理下(默认或当配置为proxy-target-class="true"),只有当前代理类的外部方法调用注解方法时代理才会被拦截。事实上,这意味着:一个目标对象的方法调用该目标对象的另外一个方法,即使被调用的方法已使用了@Transactional注解标记,事务也不会有效执行。

    另外关于@Transactional的说明,Spring 有一段描述关于方法可见性:
    @Transactional注解只对代理类时的public方法有效,被protected、private、package-visible修饰的方法使用@Transactional注解无效,对这类方法使用事务注解,推荐使用AspectJ进行事务管理。Spring框架虽然提升了效率,偶尔也会产生意外的问题,且行且研究。

  • 相关阅读:
    ZooKeeper学习第一期---Zookeeper简单介绍
    安装zookeeper(单机,伪集群)
    一张图看懂DNS域名解析全过程
    CDN基本工作过程
    第十七章、程序管理与 SELinux 初探
    直方图均衡化的缺点——不平坦
    电感耦合等离子体质谱法响应时间
    C++内容记录
    图像质量评价-NQM和WPSNR
    分颜色通道SR的相关论文
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/9013094.html
Copyright © 2011-2022 走看看