zoukankan      html  css  js  c++  java
  • spring cloud 搭建(事务)

    今天我们说一下,如何开启事务。

    之前,我们在JpaConfiguration中配置了事务开启。

    详见:https://blog.csdn.net/hanjun0612/article/details/105239557

    如果没有开启事务,会报错:Executing an update/delete query

    一,Dao事务

    其中有这一段,代表了Dao事务开启。

    @EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
    所以,如果是Dao的方法,

    我们只需要加上:@Transactional和@Modifying就可以了

    @Repository
    public interface AccountDao extends JpaRepository<Account,Integer> {
        @Transactional
        @Modifying
        @Query(value="update test_account set balance=balance-:balance where name=:name",nativeQuery=true)
        void update(@Param(value = "name")String name,@Param(value = "balance")Double balance);
    }

    二,Service事务

    如果你是Service事务的话,需要在Application启动里添加 @EnableTransactionManagement

    @SpringBootApplication(scanBasePackages = {"com.test"})
    @EnableEurekaClient
    @EnableTransactionManagement
    public class Service1Application {
     
        public static void main(String[] args) {
            SpringApplication.run(Service1Application.class, args);
        }
     
    }

    Service的调用

    这里要注意:@Transactional,不指定rollbackFor的话,

    默认只是回滚RuntimeException的异常。

    那么Exception的异常就不会回滚了。

    package com.test.service;
     
    import com.test.dao.AccountDao;
    import com.test.model.Account;
    import org.hibernate.SQLQuery;
    import org.hibernate.transform.Transformers;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
     
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
    import javax.persistence.Transient;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    /**
     * @author Tyler
     * @date 2020/3/31
     */
     
    @Service("accountService")
    public class AccountServiceImpl implements AccountService{
     
        @PersistenceContext
        EntityManager em;
     
        @Transactional(rollbackFor = Exception.class)
        public void Update(Account entity) throws Exception {
            String sql = "update test_account set balance=balance+:balance where name=:name";
     
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("balance",entity.getBalance());
            params.put("name",entity.getName());
     
            Query query = em.createNativeQuery(sql);
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                query.setParameter(entry.getKey(), entry.getValue());
            }
                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
            query.executeUpdate();
            //throw new Exception("hello");
        }
     
    }

    具体看你,是哪里控制事务的,就哪里开启。

  • 相关阅读:
    java实现httpclient 访问
    推荐博文
    Running With xpi
    1 Spring MVC 原理
    windows服务相关
    求职面试三部曲
    使用mvn插件执行工程单元测试OOM的解决办法
    maven-surefire插件问题
    小问题
    NFA到DFA实例
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/12692923.html
Copyright © 2011-2022 走看看