JAVA全系列 教程
3762个小节阅读:7094.1k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
项目的业务逻辑层主要实现具体的跨库转账的业务逻辑,由于具体的XA跨库分布式事务是由Atomikos框架内部实现的,因此在业务逻辑层处理跨库转账的逻辑时,就像操作本地数据库一样简单。
xxxxxxxxxx
@Data
@TableName("user_account")
@AllArgsConstructor
@NoArgsConstructor
public class UserAccount implements Serializable {
private static final long serialVersionUID = 6909533252826367496L;
/**
* 账户编号
*/
@TableId
private String accountNo;
/**
* 账户名称
*/
private String accountName;
/**
* 账户余额
*/
private BigDecimal accountBalance;
}
xxxxxxxxxx
public interface UserAccountService {
/**
* 跨库转账
* @param sourceAccountNo 转出账户
* @param targetSourceNo 转入账户
* @param bigDecimal 金额
*/
void transferAccounts(String sourceAccountNo, String targetSourceNo, BigDecimal transferAmount);
}
xxxxxxxxxx
package com.itbaizhan.service.impl;
import com.itbaizhan.entity.UserAccount;
import com.itbaizhan.mapper1.UserAccountMapper1;
import com.itbaizhan.mapper2.UserAccountMapper2;
import com.itbaizhan.service.IUserAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
/**
* <p>
* 服务实现类
* </p>
*
* @author itbaizhan
* @since 05-13
*/
@Service
public class UserAccountServiceImpl implements IUserAccountService {
@Autowired
private UserAccountMapper1 userAccountMapper1;
@Autowired
private UserAccountMapper2 userAccountMapper2;
/**
* 跨库转账
* @param sourceAccountNo 源账户
* @param targetSourceNo 目标账户
* @param bigDecimal 金额
*/
@Transactional
@Override
public void transofer(String sourceAccountNo, String targetSourceNo, BigDecimal bigDecimal) {
// 1. 查询原账户
UserAccount sourceUserAccount = userAccountMapper1.selectById(sourceAccountNo);
// 2. 查询目标账户
UserAccount targetUserAccount = userAccountMapper2.selectById(targetSourceNo);
// 3. 判断转入账户和转出账户是否为空
if (sourceAccountNo != null && targetUserAccount != null){
// 4. 判断转出账户是否余额不足
if (sourceUserAccount.getAccountBalance().compareTo(bigDecimal) < 0){
throw new RuntimeException("余额不足");
}
// 5.更新金额
sourceUserAccount.setAccountBalance(sourceUserAccount.getAccountBalance().subtract(bigDecimal));
// 6.张三账户减金额
userAccountMapper1.updateById(sourceUserAccount);
System.out.println(10/0);
// 7.更新金额
targetUserAccount.setAccountBalance(targetUserAccount.getAccountBalance().add(bigDecimal));
// 8.张三账户减金额
userAccountMapper2.updateById(targetUserAccount);
}
}
}