以下ã¯ã€Javaã§ã®éŠ€è¡Œå–引をシミュレートã™ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ ã®ç°¡å˜ãªè§£ç”例ã§ã™ã€‚ã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã¯ã€BankAccount クラスãŒéŠ€è¡Œã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’è¡¨ã—ã€InsufficientFundsException ãŒæ®‹é«˜ä¸è¶³æ™‚ã«ã‚¹ãƒãƒ¼ã•れるカスタム例外クラスã§ã™ã€‚トランザクションã®ãƒãƒ¼ãƒ«ãƒãƒƒã‚¯å‡¦ç†ã‚‚å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}
class BankAccount {
private String accountNumber;
private double balance;
public BankAccount(String accountNumber, double initialBalance) {
this.accountNumber = accountNumber;
this.balance = initialBalance;
}
public void deposit(double amount) {
balance += amount;
System.out.println("Deposited: " + amount);
System.out.println("New Balance: " + balance);
}
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
throw new InsufficientFundsException("Insufficient funds. Withdrawal not allowed.");
}
balance -= amount;
System.out.println("Withdrawn: " + amount);
System.out.println("New Balance: " + balance);
}
// シミュレートã®ãŸã‚ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ãƒãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’実装
public void rollback(double amount) {
balance += amount;
System.out.println("Transaction rolled back. New Balance: " + balance);
}
}
public class BankTransactionSimulation {
public static void main(String[] args) {
BankAccount account = new BankAccount("12345", 1000.0);
try {
// æ£å¸¸ãªå–引
account.deposit(500.0);
// 残高ä¸è¶³ã§ä¾‹å¤–ãŒç™ºç”Ÿã™ã‚‹å–引
try {
account.withdraw(2000.0);
} catch (InsufficientFundsException e) {
System.out.println(e.getMessage());
account.rollback(500.0); // 残高ä¸è¶³ã®ãŸã‚ãƒãƒ¼ãƒ«ãƒãƒƒã‚¯
}
// å†åº¦æ£å¸¸ãªå–引
account.withdraw(200.0);
} catch (InsufficientFundsException e) {
System.out.println(e.getMessage());
}
}
}
ã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã¯ã€withdraw ãƒ¡ã‚½ãƒƒãƒ‰å†…ã§æ®‹é«˜ä¸è¶³ã®å ´åˆã« InsufficientFundsException をスãƒãƒ¼ã—ã¦ã„ã¾ã™ã€‚ãã®å¾Œã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒãƒãƒ¼ãƒ«ãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ã“ã®ã‚ˆã†ã«ã€å–引ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«ã¯ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’å…ƒã®çŠ¶æ…‹ã«æˆ»ã™ã“ã¨ãŒé‡è¦ã§ã™ã€‚
トランザクション処ç†ã®ä¾‹å¤–管ç†
トランザクション処ç†ã§ã¯ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚„銀行å–引ãªã©ã®ä¸€é€£ã®æ“作ãŒåŽŸåçš„ã«è¡Œã‚れるã“ã¨ãŒæœŸå¾…ã•れã¾ã™ã€‚ã“れã¯ã¤ã¾ã‚Šã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å†…ã®ä¸€éƒ¨ã®æ“作ãŒå¤±æ•—ã—ãŸå ´åˆã€å…¨ä½“ãŒãƒãƒ¼ãƒ«ãƒãƒƒã‚¯ã•れã€å¤‰æ›´ãŒé©ç”¨ã•れãªã„ã¨ã„ã†ã“ã¨ã‚’指ã—ã¾ã™ã€‚トランザクション処ç†ã«ãŠã„ã¦ã€ä¾‹å¤–管ç†ã¯éžå¸¸ã«é‡è¦ã§ã™ã€‚以下ã«ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å‡¦ç†ã®ä¾‹å¤–管ç†ã®ãƒã‚¤ãƒ³ãƒˆã¨è§£èª¬ã‚’示ã—ã¾ã™ã€‚
- 例外ã®ç¨®é¡žã«ã‚ˆã‚‹åˆ†é¡ž:
- 一般例外 (General Exception): プãƒã‚°ãƒ©ãƒ 全体を包括ã™ã‚‹åºƒç¯„ãªä¾‹å¤–を指ã—ã¾ã™ã€‚ã“れらã®ä¾‹å¤–ã¯ã€ç‰¹å®šã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã“ã¨ã‚’示ã™ã‚‚ã®ã§ã¯ã‚りã¾ã›ã‚“。通常ã€é–‹ç™ºè€…ãŒæ„図的ã«ç‰¹å®šã®ä¾‹å¤–ã‚’ã‚ャッãƒã™ã‚‹å ´åˆã‚’除ã„ã¦ã€é¿ã‘ã‚‹ã¹ãã§ã™ã€‚
- 特定ã®ä¾‹å¤– (Specific Exception): 特定ã®ã‚¨ãƒ©ãƒ¼çжæ³ã«é–¢é€£ã™ã‚‹ä¾‹å¤–。ãŸã¨ãˆã°ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹æŽ¥ç¶šã®å–ªå¤±ã€SQL ã‚¯ã‚¨ãƒªã®æ§‹æ–‡ã‚¨ãƒ©ãƒ¼ã€æ®‹é«˜ä¸è¶³ãªã©ãŒè©²å½“ã—ã¾ã™ã€‚
- トランザクションã®ã‚¢ãƒˆãƒŸã‚·ãƒ†ã‚£:
- トランザクションã¯ã‚¢ãƒˆãƒŸãƒƒã‚¯æ€§ã‚’æŒã¡ã¾ã™ã€‚ã“れã¯ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å†…ã®ã™ã¹ã¦ã®æ“ä½œãŒæˆåŠŸã™ã‚‹ã‹ã€ã©ã‚Œã‹ä¸€ã¤ã§ã‚‚失敗ã™ã‚‹ã¨å…¨ã¦ãŒãƒãƒ¼ãƒ«ãƒãƒƒã‚¯ã•れるã¨ã„ã†åŽŸå‰‡ã§ã™ã€‚トランザクション内ã§ä¾‹å¤–ãŒç™ºç”Ÿã—ãŸå ´åˆã€ãれをé©åˆ‡ã«å‡¦ç†ã—ã¦ãƒãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’行ã†å¿…è¦ãŒã‚りã¾ã™ã€‚
- トランザクションã®ãƒãƒ¼ãƒ«ãƒãƒƒã‚¯:
- トランザクション内ã§å•題ãŒç™ºç”Ÿã—ãŸå ´åˆã€ã™ã¹ã¦ã®å¤‰æ›´ã‚’å–り消ã—ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’å…ƒã®çŠ¶æ…‹ã«æˆ»ã™å¿…è¦ãŒã‚りã¾ã™ã€‚ã“ã®ãƒ—ãƒã‚»ã‚¹ã‚’ãƒãƒ¼ãƒ«ãƒãƒƒã‚¯ã¨å‘¼ã³ã¾ã™ã€‚ãƒãƒ¼ãƒ«ãƒãƒƒã‚¯ã¯ã€ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ã‚’ä¿ã¤ãŸã‚ã«éžå¸¸ã«é‡è¦ã§ã™ã€‚
- データベーストランザクションã®ä¾‹å¤–処ç†:
- データベーストランザクションã§ã¯ã€SQL 実行時ã«ä¾‹å¤–ãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚SQL エラーã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æŽ¥ç¶šã‚¨ãƒ©ãƒ¼ã€ä¸€æ„制約é•åãªã©ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ã“れらã®ä¾‹å¤–ã‚’é©åˆ‡ã«å‡¦ç†ã—ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’ãƒãƒ¼ãƒ«ãƒãƒƒã‚¯ã™ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚
- トランザクション管ç†ã®ãƒ™ã‚¹ãƒˆãƒ—ラクティス:
- トランザクション内ã§ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ã®ã‚る例外をã‚ャッãƒã—ã€ãƒãƒ¼ãƒ«ãƒãƒƒã‚¯å‡¦ç†ã‚’行ã†éš›ã«ã¯ã€ã‚¨ãƒ©ãƒ¼ãƒã‚°ã«è©³ç´°ãªæƒ…å ±ã‚’è¨˜éŒ²ã™ã‚‹ã¨è‰¯ã„ã§ã—ょã†ã€‚ã“れã«ã‚ˆã‚Šã€å•題ã®ç‰¹å®šã¨è§£æ±ºãŒå®¹æ˜“ã«ãªã‚Šã¾ã™ã€‚
try {
// トランザクション開始
// データベース更新ãªã©ã®å‡¦ç†
// トランザクションæˆåŠŸ
commitTransaction();
} catch (SQLException e) {
// データベーストランザクション内ã§ã®ä¾‹å¤–処ç†
rollbackTransaction();
logError("Database Transaction Error", e);
} catch (InsufficientFundsException e) {
// 自作例外ãªã©ã€ç‰¹å®šã®ã‚¨ãƒ©ãƒ¼ã«é–¢é€£ã™ã‚‹ä¾‹å¤–処ç†
rollbackTransaction();
logError("Insufficient Funds Error", e);
} catch (Exception e) {
// 一般的ãªä¾‹å¤–処ç†
rollbackTransaction();
logError("General Error", e);
} finally {
// トランザクション終了処ç†
closeConnection
トランザクション処ç†ã®ä¾‹å¤–管ç†ã¯ã€ã‚·ã‚¹ãƒ†ãƒ ã®ä¿¡é ¼æ€§ã¨ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ã‚’確ä¿ã™ã‚‹ãŸã‚ã«ä¸å¯æ¬ ã§ã™ã€‚é©åˆ‡ãªä¾‹å¤–処ç†ã¨ãƒãƒ¼ãƒ«ãƒãƒƒã‚¯ãŒå®Ÿè£…ã•れãŸå ´åˆã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å†…ã§ç™ºç”Ÿã™ã‚‹å•é¡Œã«æŸ”軟ã«å¯¾å¿œã§ãã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¦ã‚‚データベースやシステム全体ãŒå®‰å…¨ãªçŠ¶æ…‹ã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
例外処ç†ã®ãƒã‚¤ãƒ³ãƒˆã¯ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å†…ã§ã®æ“作ãŒã‚¢ãƒˆãƒŸãƒƒã‚¯ã§ã‚ã‚‹ã“ã¨ã€ã¤ã¾ã‚ŠæˆåŠŸã‹å¤±æ•—ã‹ã®ã©ã¡ã‚‰ã‹ä¸€æ–¹ã—ã‹å˜åœ¨ã—ãªã„ã“ã¨ã‚’確èªã™ã‚‹ã“ã¨ã§ã™ã€‚ã“れã«ã‚ˆã‚Šã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒä¸å®Œå…¨ãªçŠ¶æ…‹ã«ãªã‚‹ã“ã¨ã‚’防ãŽã€ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ã‚’確ä¿ã—ã¾ã™ã€‚
é©åˆ‡ãªä¾‹å¤–å‡¦ç†æˆ¦ç•¥ã‚’構築ã™ã‚‹ã“ã¨ã§ã€ã‚·ã‚¹ãƒ†ãƒ ã¯è€éšœå®³æ€§ã‚’å‘上ã•ã›ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¨ã‚¯ã‚¹ãƒšãƒªã‚¨ãƒ³ã‚¹ã‚’å‘上ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãã—ã¦ã€ç™ºç”Ÿã—ãŸã‚¨ãƒ©ãƒ¼ã«å¯¾ã—ã¦è¿…速ã«å¯¾å¿œã—ã€ãƒã‚°ã‚’通ã˜ã¦å•題ã®è¿½è·¡ãŒå®¹æ˜“ã«ãªã‚Šã¾ã™ã€‚
トランザクション処ç†ã«ãŠã‘る例外管ç†ã¯ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚„å–引ãªã©ã®é‡è¦ãªæ“作ã«ãŠã„ã¦ç‰¹ã«é‡è¦ã§ã‚りã€ã“れã«ã‚ˆã£ã¦ã‚·ã‚¹ãƒ†ãƒ 全体ã®ä¿¡é ¼æ€§ãŒå‘上ã—ã¾ã™ã€‚
「019 例外ã¨ä¾‹å¤–処ç†ã€å•題集リスト
🎯 実習ã§ç†è§£ã‚’æ·±ã‚よã†
ã“ã®å†…容ã«ã¤ã„ã¦JavaDrillã§å®Ÿéš›ã«æ‰‹ã‚’å‹•ã‹ã—ã¦å¦ç¿’ã§ãã¾ã™


コメント