spring cloud 搭建(事务)

90 篇文章 1 订阅
63 篇文章 0 订阅

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

之前,我们在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");
    }

}

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值