From 99ded7286cfc94bd499c450c8f202297c87e66cf Mon Sep 17 00:00:00 2001 From: caniro Date: Fri, 13 Jun 2025 21:44:26 +0900 Subject: [PATCH 1/2] =?UTF-8?q?add:=20=EB=B4=87=20=EC=9E=90=EC=82=B0=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=20=EC=8B=9C=20=EC=A3=BC=EB=AC=B8,?= =?UTF-8?q?=20=EC=B2=B4=EA=B2=B0=EA=B3=BC=20=EB=8F=99=EC=9D=BC=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=ED=8A=B8=EB=9E=9C=EC=9E=AD=EC=85=98=20=EA=B2=A9?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A4=80=20=EB=B3=80=EA=B2=BD(Read=20Comm?= =?UTF-8?q?itted)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cleanengine/coin/user/info/application/AccountService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cleanengine/coin/user/info/application/AccountService.java b/src/main/java/com/cleanengine/coin/user/info/application/AccountService.java index 94329ad2..af743b5d 100644 --- a/src/main/java/com/cleanengine/coin/user/info/application/AccountService.java +++ b/src/main/java/com/cleanengine/coin/user/info/application/AccountService.java @@ -6,6 +6,7 @@ import com.cleanengine.coin.user.info.infra.WalletRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import java.util.Optional; @@ -38,7 +39,7 @@ public Account createNewAccount(Integer userId, double cash) { return accountRepository.save(account); } - @Transactional + @Transactional(isolation = Isolation.READ_COMMITTED) public void resetBot(String ticker) { Account sellBotAccount = accountRepository.findByUserId(SELL_ORDER_BOT_ID).orElseThrow(); sellBotAccount.setCash(0.0); From 2229a569b525652721e9aa8eb07e199db0fd14bd Mon Sep 17 00:00:00 2001 From: caniro Date: Fri, 13 Jun 2025 21:45:08 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20Deadlock=20=EB=B0=A9=EC=A7=80?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20account=20=EC=A0=91=EA=B7=BC?= =?UTF-8?q?=20=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cleanengine/coin/trade/application/TradeExecutor.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/cleanengine/coin/trade/application/TradeExecutor.java b/src/main/java/com/cleanengine/coin/trade/application/TradeExecutor.java index cb7338f4..b8e4ca14 100644 --- a/src/main/java/com/cleanengine/coin/trade/application/TradeExecutor.java +++ b/src/main/java/com/cleanengine/coin/trade/application/TradeExecutor.java @@ -71,15 +71,16 @@ public void executeTrade(WaitingOrders waitingOrders, TradePair tr tradeService.updateOrder(sellOrder); // 예수금 처리 + // - 매도 예수금 처리 + this.increaseAccountCash(sellOrder, totalTradedPrice); + // - 매수 잔여금액 반환 if (!isMarketOrder(buyOrder) && buyOrder.getPrice() > tradedPrice) { // 매도 호가보다 높은 가격에 매수를 시도한 경우, 차액 반환 + log.debug("[{}] 매도 호가보다 높은 가격에 매수를 시도한 경우, 차액 반환", Thread.currentThread().threadId()); double totalRefundAmount = (buyOrder.getPrice() - tradedPrice) * tradedSize; this.increaseAccountCash(buyOrder, totalRefundAmount); } - // - 매도 예수금 처리 - this.increaseAccountCash(sellOrder, totalTradedPrice); - // 지갑 누적계산 this.updateWalletAfterTrade(buyOrder, ticker, tradedSize, totalTradedPrice); this.updateWalletAfterTrade(sellOrder, ticker, tradedSize, totalTradedPrice);