æ³ç´æ¥çç»è®ºçå¯ä»¥æå°ææ«æ»ç»ã
èæ¯
æä»¬å ¬å¸çç³»ç»ä¸æä¸ä¸ªä¸å¡åºæ¯ï¼éè¦ç¬¬ä¸æ¹çè´¦æ·æ°æ®åæ¥å°æä»¬ç³»ç»ã
åæ¥è´¦å·çåæ¶ï¼ä¼å°ææåæ¥æ°æ®åæ¯å¦æåè®°å½å°ä¸å¼ 忥æ¥å¿è¡¨ä¸ï¼æ¹ä¾¿ææ¥é®é¢åè®°å½ã
好äºï¼è¯ä¸å¤è¯´ï¼æä»¬ç´æ¥ä¸ä»£ç ã
欢è¿å ³æ³¨ä¸ªäººå ¬ä¼å·ã好好妿æ¯ã交æµå¦ä¹
ç®åç代ç
ä¸é¢æ¯ä¸æ®µä¼ªä»£ç
javaå¤å¶ä»£ç @Data
@Build
public class Test() {
private boolean success = true;
}
@Transaction
public void sync() {
Test test = Test.builder().build();
try{
xxxxx
}catch(Exception e) {
log.error("xxxx",e)
test.setSuccess(false);
throw new ThirdAccountException("åæ¥è´¦å·é误ï¼" + e.getMessage());
} finally {
testMapper.insert(test);
}
}
大家è½çåºæ¥è¿æ®µä»£ç æä»ä¹é®é¢åï¼
talk is cheap, show me the code
ç´æ¥å®ææ¼ç¤º
æ°æ®åºæ°å»º è´¦æ·æ°æ®åæ¥è®°å½è¡¨
sqlå¤å¶ä»£ç CREATE TABLE `account_log` (
`id` bigint NOT NULL,
`data` varchar(255) DEFAULT NULL COMMENT 'ç¬¬ä¸æ¹æ°æ®',
`success` tinyint(1) DEFAULT NULL COMMENT 'æ¯å¦æå0å¦1æ¯',
`error_msg` varchar(255) DEFAULT NULL COMMENT 'é误信æ¯',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ç¬¬ä¸æ¹è´¦æ·æ°æ®å®ä½
javaå¤å¶ä»£ç package com.fandf.demo.transaction;
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author fandongfeng
* @date 2023/6/17 14:45
*/
@Data
@AllArgsConstructor(staticName = "of")
@ApiModel("ç¬¬ä¸æ¹æ°æ®å®ä½")
public class ThirdAccount {
private String id;
private String data;
public AccountLog toAccountLog() {
return AccountLog.builder().data(JSONUtil.toJsonStr(this)).build();
}
}
æ¬å°è´¦æ·åæ¥è®°å½å®ä½
javaå¤å¶ä»£ç package com.fandf.demo.transaction;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author fandongfeng
* @date 2023/6/17 14:43
*/
@EqualsAndHashCode(callSuper = true)
@TableName("account_log")
@Data
@Builder
public class AccountLog extends Model<AccountLog> {
private static final long serialVersionUID = 5648238459610595434L;
@TableId(type = IdType.ASSIGN_ID)
private Long id;
@ApiModelProperty("ç¬¬ä¸æ¹åå§æ°æ®")
private String data;
@ApiModelProperty("æ¯å¦æå: 0å¦1æ¯")
private boolean success = true;
@ApiModelProperty("éè¯¯æ°æ®")
private String errorMsg;
}
æ¬å°è´¦æ·åæ¥è®°å½å®ä½mapper
javaå¤å¶ä»£ç package com.fandf.demo.transaction;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
/**
* @author fandongfeng
* @date 2023/6/17 14:50
*/
@Repository
public interface AccountLogMapper extends BaseMapper<AccountLog> {
}
åæ¥è´¦æ·å¤ççé»è¾
javaå¤å¶ä»£ç package com.fandf.demo.transaction;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @author fandongfeng
* @date 2023/6/17 14:42
*/
@Service
public class TestTransaction {
@Resource
AccountLogMapper accountLogMapper;
@Transactional(rollbackFor = Exception.class)
public void syncAccount(ThirdAccount account) {
AccountLog accountLog = account.toAccountLog();
try {
//模æid为2 åæåºå¼å¸¸
if ("2".equals(account.getId())) {
throw new Exception("模ææåºå¼å¸¸");
}
} catch (Exception e) {
accountLog.setSuccess(false);
accountLog.setErrorMsg(e.getMessage());
throw new IllegalArgumentException("åæ¥ç¬¬ä¸æ¹è´¦å·é误ï¼" + e.getMessage());
} finally {
accountLogMapper.insert(accountLog);
}
}
}
åå æµè¯
æå ¥æåæ¡ä¾
javaå¤å¶ä»£ç package com.fandf.demo.transaction;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class TestTransactionTest {
@Resource
TestTransaction testTransaction;
@Test
void syncAccount() {
testTransaction.syncAccount(ThirdAccount.of("1", "æåæ°æ®"));
}
}
æ¥çæ°æ®åº
æ¯æå ¥äºï¼ä½æ¯æåçsuccessåºè¯¥ä¸º1åï¼ä¸ºä»ä¹æå ¥äº0ã
AccountLog.java
javaå¤å¶ä»£ç @ApiModelProperty("æ¯å¦æå: 0å¦1æ¯")
private boolean success = true;
ç¬¬ä¸æ¹è½¬ä¸ºAccountLogå®ä½çæ¹æ³
javaå¤å¶ä»£ç public AccountLog toAccountLog() {
return AccountLog.builder().data(JSONUtil.toJsonStr(this)).build();
}
æä»¬æ¥ççç¼è¯åçAccountLog.classæºç ä¸çAccountLogBuilderé¨å successå¹¶æªèµåå§å¼
javaå¤å¶ä»£ç public static class AccountLogBuilder {
private Long id;
private String data;
private boolean success;
private String errorMsg;
AccountLogBuilder() {
}
public AccountLogBuilder id(Long id) {
this.id = id;
return this;
}
public AccountLogBuilder data(String data) {
this.data = data;
return this;
}
public AccountLogBuilder success(boolean success) {
this.success = success;
return this;
}
public AccountLogBuilder errorMsg(String errorMsg) {
this.errorMsg = errorMsg;
return this;
}
public AccountLog build() {
return new AccountLog(this.id, this.data, this.success, this.errorMsg);
}
public String toString() {
return "AccountLog.AccountLogBuilder(id=" + this.id + ", data=" + this.data + ", success=" + this.success + ", errorMsg=" + this.errorMsg + ")";
}
}
æä»¬çå°Builder()æ¹æ³è¿åäº
AccountLogBuilder() {
}
对象ã
æå®data
javaå¤å¶ä»£ç public AccountLogBuilder data(String data) {
this.data = data;
return this;
}
æ§è¡build()æ¹æ³
javaå¤å¶ä»£ç public AccountLog build() {
return new AccountLog(this.id, this.data, this.success, this.errorMsg);
}
successå¹¶æªèµåå§å¼ï¼æä»¥success=false, åå°æ°æ®åºå°±æ¯0äºã
é£ä¹æä¹è§£å³å¢ï¼
- 1.åæ®µå 䏿³¨è§£@Builder.Default
javaå¤å¶ä»£ç @Builder.Default
private boolean success = true;
æä»¬åæ¥æµè¯ä¸
javaå¤å¶ä»£ç @Test
void syncAccount() {
testTransaction.syncAccount(ThirdAccount.of("1", "å ä¸@Builder.Defaultæåæ°æ®"));
}
æ¥çæ°æ®åº
æå ¥æåã
- 2.æå¨èµå¼
javaå¤å¶ä»£ç public AccountLog toAccountLog() {
return AccountLog.builder().success(true).data(JSONUtil.toJsonStr(this)).build();
}
æå ¥å¤±è´¥æ¡ä¾
javaå¤å¶ä»£ç @Test
void syncAccount() {
testTransaction.syncAccount(ThirdAccount.of("2", "æµè¯å¤±è´¥æ°æ®"));
}
æ¥çæ°æ®åº
éè¯¯æ°æ®å¹¶æ²¡ææå ¥è¿æ¥ã
è¿æ¯å 为catché颿åºäºå¼å¸¸ï¼finallyéé¢æäº¤çäºå¡ä¹åæ»äºï¼æä»¬å»æsyncAccount(ThirdAccount account)æ¹æ³ä¸é¢ç@Transactional注解ã
åæ§è¡ä¸æ¬¡åå æµè¯
javaå¤å¶ä»£ç @Test
void syncAccount() {
testTransaction.syncAccount(ThirdAccount.of("2", "廿@Transactional注解æµè¯å¤±è´¥æ°æ®"));
}
æ¥çæ°æ®åº
æ»ç»
- 1.Build并䏿¯å¯¹å±æ§èµäºé»è®¤å¼ï¼å¦ææ³æå®é»è®¤å¼å¯ä»¥å¨å段ä¸ä½¿ç¨@Builder.Default注解ã
- 2.å¦ææ¹æ³ä¸å äº@Transaction注解ï¼catché颿åºäºå¼å¸¸,finallyéé¢çäºå¡ä¼åæ»ã
å½ç¶æä»¬å¨ä½¿ç¨@Transactionæ³¨è§£çæ¶åä¹éè¦æ³¨æäºå¡çç²åº¦ï¼ä¸è½å¾çäºç´æ¥å¨å ¥å£å ä¸ä¸ªTransaction注解ã