किताब वापस करना
आप Metropolitan Public Library के मैनेजमेंट सिस्टम के डेवलपर हैं. पिछले हफ्ते एक गंभीर बग मिला: जब सिस्टम किताब वापसी के दौरान क्रैश हो गया, तो लोन को "returned" मार्क कर दिया गया, लेकिन इन्वेंटरी में किताब "checked-out" ही दिखती रही. स्टाफ के डेटाबेस को मैन्युअली ठीक करने तक वह किताब हफ्तों तक उपलब्ध नहीं रही.
जब कोई किताब लौटाई जाती है, तो ये तीनों ऑपरेशंस या तो साथ में सफल हों या साथ में विफल हों:
- लोन रिकॉर्ड को "returned" स्टेटस में अपडेट करें.
- किताब की उपलब्धता "checked-out" से बदलकर "available" करें.
- अगर किताब देरी से लौटाई गई है, तो जुर्माना रिकॉर्ड करें.
आपका कार्य है सही ट्रांजैक्शन कंट्रोल लागू करना ताकि डेटा की कंसिस्टेंसी बनी रहे.
यह अभ्यास पाठ्यक्रम का हिस्सा है
Java में PostgreSQL डेटाबेस को क्वेरी करना
अभ्यास निर्देश
- शुरुआत में लाइन 26 पर
autoCommitकोfalseसेट करें. - अगर सभी ऑपरेशंस सफल हों, तो लाइन 59 पर ट्रांजैक्शन को commit करें.
- अगर कोई भी ऑपरेशन विफल हो, तो लाइन 66 पर ट्रांजैक्शन को rollback करें.
इंटरैक्टिव व्यावहारिक अभ्यास
इस अभ्यास को इस नमूना कोड को पूरा करके आज़माएँ।
public class BookReturnProcessor {
public static void main(String[] args) {
int loanId = 1;
int bookId = 5;
LocalDate dueDate = LocalDate.now().minusDays(2);
try {
boolean success = processBookReturn(loanId, bookId, dueDate);
if (success) {
System.out.println("Book return processed successfully.");
} else {
System.out.println("Book return processing failed.");
}
} catch (SQLException e) {
System.err.println("Database error: " + e.getMessage());
}
}
public static boolean processBookReturn(int loanId, int bookId, LocalDate dueDate) throws SQLException {
Connection conn = null;
try {
HikariDataSource ds = HikariSetup.createDataSource();
conn = ds.getConnection();
// Start transaction by setting autoCommit to false
conn.____(____);
String updateLoanSQL = "UPDATE loans SET status = 'returned', return_date = ? WHERE loan_id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(updateLoanSQL)) {
pstmt.setDate(1, java.sql.Date.valueOf(LocalDate.now()));
pstmt.setInt(2, loanId);
pstmt.executeUpdate();
}
String updateBookSQL = "UPDATE books SET status = 'available' WHERE book_id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(updateBookSQL)) {
pstmt.setInt(1, bookId);
pstmt.executeUpdate();
}
LocalDate today = LocalDate.now();
if (today.isAfter(dueDate)) {
long daysLate = ChronoUnit.DAYS.between(dueDate, today);
double fineAmount = daysLate * 0.50;
String insertFineSQL = "INSERT INTO fines (loan_id, amount, reason, date_assessed) VALUES (?, ?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(insertFineSQL)) {
pstmt.setInt(1, loanId);
pstmt.setDouble(2, fineAmount);
pstmt.setString(3, "Book returned " + daysLate + " days late");
pstmt.setDate(4, java.sql.Date.valueOf(today));
pstmt.executeUpdate();
}
System.out.println("Fine created: $" + fineAmount + " for loan " + loanId);
}
// Commit the transaction
conn.____();
return true;
} catch (SQLException e) {
// Roll back the transaction if an error occurs
if (conn != null) {
conn.____();
}
System.err.println("Error processing return: " + e.getMessage());
return false;
}
}
}