spring boot基于注解的聲明式事務(wù)配置詳解
事務(wù)配置
1、配置方式一
1)開(kāi)啟spring事務(wù)管理,在spring boot啟動(dòng)類添加注解@EnableTransactionManagement(proxyTargetClass = true);等同于xml配置方式的 <tx:annotation-driven />(注意:1項(xiàng)目中只需配置一次,2需要配置proxyTargetClass = true)
2)在項(xiàng)目中需要添加事務(wù)的類或方法上添加注解@Transactional(建議添加在方法上),一般使用默認(rèn)屬性即可,若要使用事務(wù)各屬性可查看spring事務(wù)官方文檔了解
2、配置方式二(指定事務(wù),需要多個(gè)事務(wù)管理器時(shí)用)
1)開(kāi)啟事務(wù)管理:創(chuàng)建多個(gè)事務(wù),如下例子
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
public class TransactionConfig implements TransactionManagementConfigurer{
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.druid.url}")
private String url;
@Value("${spring.datasource.druid.username}")
private String username;
@Value("${spring.datasource.druid.password}")
private String password;
@Bean
public DataSource dataSourceDb() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
/**
* 【作用】事務(wù)管理器<br>
* 【說(shuō)明】(無(wú))
* @param
* @author Kalvin
* @Date 2017/12/19 10:39
*/
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSourceDb());
}
// 創(chuàng)建事務(wù)管理器2
@Bean(name = "txManager2")
public PlatformTransactionManager txManager2(EntityManagerFactory factory) {
return new JpaTransactionManager(factory);
}
/**
* 【作用】如果沒(méi)有指定事務(wù),默認(rèn)返回當(dāng)前事務(wù)管理<br>
* 【說(shuō)明】(無(wú))
* @param
* @author kkyc
* @Date 2017/12/19 10:03
*/
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return transactionManager();
}
}
到這里已經(jīng)成功整合好事務(wù)配置了,你只需要在使用的地方添加注解@Transactional即可,如果需要限定事務(wù)管理器,可使用@Transactional(“txManager2”)
spring boot事務(wù)(注解模式)
使用注解模式不需要配置文件,也不需要配置事務(wù)配置類或者方法,只需要使用“@Transcation”注解引入到相對(duì)應(yīng)的位置即可實(shí)現(xiàn)事務(wù)回滾功能。
1.引入pom.xml
<!-- 事物 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
2.在controller里面使用事務(wù)注解
因?yàn)閟ervice和接口層都是直接操作數(shù)據(jù)庫(kù)的方法,一般需要多個(gè)操作或者循環(huán)的Controller才需要事務(wù)支持,如果是mybatis批量操作數(shù)據(jù)庫(kù)語(yǔ)句也不需要事務(wù)
事務(wù)作用域一般常見(jiàn)的分成兩種:
①定義在類上面 :所有的方法都支持事務(wù)
②定義在方法上 :只有該方法支持事務(wù)
package com.Transaction.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.Transaction.entity.Alarmtype;
import com.Transaction.mapper.AlarmtypeMapper;
import com.Transaction.service.AlarmtypeService;
@Controller
//@Transactional //事務(wù)級(jí)別,如果該類中同時(shí)操作多個(gè)方法,只要失敗則全部回滾
public class AlarmtypeController {
@Autowired
AlarmtypeMapper alarmtypeMapper;
@Autowired
AlarmtypeService alarmtypeService;
@RequestMapping("index")
public synchronized String index(){
//List<Alarmtype> list = alarmtypeMapper.getAlarmtypeList();
List<Alarmtype> list = alarmtypeService.findAll();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getId()+"--"+list.get(i).getAlarmname());
}
return "index";
}
//批量插入
@RequestMapping("addBatch")
@ResponseBody
@Transactional//對(duì)整個(gè)方法進(jìn)行事務(wù)處理,方法體內(nèi)只要有一個(gè)方法沒(méi)執(zhí)行成功則全部回滾
public synchronized int addBatch(){
Alarmtype alarmtype = new Alarmtype();
Alarmtype updatealarmtype = new Alarmtype();
updatealarmtype.setId(1);
updatealarmtype.setAlarmname("修改前輪故障");
alarmtypeMapper.updateAlarmtypeById(updatealarmtype);
int result = 0;
try {
for (int i = 0; i < 5; i++) {
if(i==2){
//alarmname在數(shù)據(jù)庫(kù)中長(zhǎng)度不超過(guò)50,賦值超過(guò)50報(bào)異常 Data too long
alarmtype.setAlarmname("測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試測(cè)試");
alarmtype.setAlarmtypeid(i);
}else{
alarmtype.setAlarmname("測(cè)試"+i);
alarmtype.setAlarmtypeid(i);
}
result = alarmtypeMapper.addAlarmtype(alarmtype);
}
}catch (Exception e) {
e.printStackTrace();
}
return result;
}
@RequestMapping("test")
@ResponseBody
public synchronized String test(){
return "test";
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)http請(qǐng)求工具類示例
這篇文章主要介紹了java實(shí)現(xiàn)http請(qǐng)求工具類示例,需要的朋友可以參考下2014-05-05
Java實(shí)現(xiàn)俄羅斯方塊游戲簡(jiǎn)單版
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)俄羅斯方塊游戲簡(jiǎn)單版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Spring Security實(shí)現(xiàn)退出登錄和退出處理器
本文主要介紹了Spring Security實(shí)現(xiàn)退出登錄和退出處理器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
MyBatisPlus3如何向數(shù)據(jù)庫(kù)中存入List
本文主要介紹了Mybatis Plus的類型處理器的使用,通過(guò)User.java和UserMapper.xml示例進(jìn)行詳細(xì)的解析,并提供了JSON解析器的使用方法,希望通過(guò)這篇文章,可以幫助大家更好的理解和掌握Mybatis Plus的類型處理器2024-10-10
Java練習(xí)題之實(shí)現(xiàn)平方根(sqrt)函數(shù)
這篇文章主要介紹了Java練習(xí)題之實(shí)現(xiàn)平方根(sqrt)函數(shù)的相關(guān)資料,平方根是一個(gè)數(shù)學(xué)概念,表示一個(gè)數(shù)的正平方根,文中通過(guò)代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
解決springdataJPA對(duì)原生sql支持的問(wèn)題
這篇文章主要介紹了解決springdataJPA對(duì)原生sql支持的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

