今天我們說一下,如何開啟事務。
之前,我們在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"); } }
具體看你,是哪里控制事務的,就哪里開啟。