Stored Procedures হল ডেটাবেসে সংরক্ষিত SQL কোডের ব্লক যা একাধিক SQL অপারেশন বা কমপ্লেক্স ট্রানজেকশন পরিচালনা করতে ব্যবহৃত হয়। Java অ্যাপ্লিকেশনে, Stored Procedures এর সাথে Complex Transactions ব্যবহারের মাধ্যমে আপনি ডেটাবেসে একাধিক অপারেশন একসাথে কার্যকর করতে পারেন। এই টিউটোরিয়ালে, আমরা দেখব কিভাবে Stored Procedures এবং Transactions ব্যবহার করে একটি কমপ্লেক্স ট্রানজেকশন Java MySQL অ্যাপ্লিকেশনে তৈরি করা যায়।
1. Stored Procedures in MySQL
Stored Procedures হল SQL কোডের একটি গ্রুপ যা ডেটাবেসে সংরক্ষিত থাকে এবং প্রয়োজনে কল করা হয়। এই প্রক্রিয়া ডেটাবেসে সেন্ট্রালাইজড লজিক ব্যবস্থাপনার সুবিধা দেয়।
1.1 Stored Procedure তৈরি করা
উদাহরণস্বরূপ, একটি Stored Procedure তৈরি করা যাক যা দুটি টেবিলের মধ্যে ডেটা ইনসার্ট করবে, যদি দুটি ইনসার্ট অপারেশন সফল হয় তবে ট্রানজেকশন কমপ্লিট হবে, অন্যথায় কোনো কিছু ইনসার্ট হবে না।
DELIMITER
DELIMITER ;
এই স্টোরড প্রোসিডিউরে দুটি ইনসার্ট অপারেশন করা হয়েছে:
- users টেবিলে ডেটা ইনসার্ট করা।
- orders টেবিলে, users টেবিলের পরবর্তী user_id ইনসার্ট করা।
যদি কোনো ত্রুটি ঘটে (যেমন, ইনসার্ট অপারেশন ব্যর্থ হয়), তাহলে ROLLBACK করা হবে এবং কোনো পরিবর্তন ডেটাবেসে রাখা হবে না।
2. Java Code: Stored Procedure Call করা
Java থেকে Stored Procedure কল করার জন্য, আমরা CallableStatement ব্যবহার করি। এটি স্টোরড প্রোসিডিউর রান করার জন্য প্রস্তুতকৃত স্টেটমেন্ট ব্যবহৃত হয়। নিচে একটি উদাহরণ দেওয়া হল যেখানে আমরা Java কোড থেকে উপরের স্টোরড প্রোসিডিউরটি কল করছি।
import java.sql.*;
public class ComplexTransactionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database";
String username = "root";
String password = "your_password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
// ট্রানজেকশন শুরু করা
connection.setAutoCommit(false);
// Stored Procedure কল করা
String sql = "{CALL insertUserAndOrder(?, ?)}";
try (CallableStatement stmt = connection.prepareCall(sql)) {
stmt.setString(1, "John Doe"); // p_user_name
stmt.setDate(2, Date.valueOf("2024-12-15")); // p_order_date
// স্টোরড প্রোসিডিউর চালানো
stmt.execute();
// পরিবর্তনগুলি কমিট করা
connection.commit();
System.out.println("User and order inserted successfully.");
} catch (SQLException e) {
// কোনো ত্রুটি হলে রোলব্যাক করা
connection.rollback();
System.out.println("Transaction failed, rolling back.");
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
এই কোডে:
- Connection.setAutoCommit(false) ব্যবহার করা হয়েছে, যাতে ট্রানজেকশন ম্যানুয়ালি কমিট বা রোলব্যাক করা যায়।
- CallableStatement ব্যবহার করে insertUserAndOrder স্টোরড প্রোসিডিউর কল করা হয়েছে।
- যদি কোনো সমস্যা হয়, তাহলে connection.rollback() কল করে ট্রানজেকশন রোলব্যাক করা হবে।
3. Complex Transactions with Multiple Stored Procedures
একটি ট্রানজেকশন সাধারণত একাধিক Stored Procedure বা SQL অপারেশন সম্পাদন করতে পারে। উদাহরণস্বরূপ, যদি আপনি একটি complex order processing সিস্টেম তৈরি করছেন, যেখানে ব্যবহারকারী একাধিক আইটেম অর্ডার করে, আপনি একাধিক স্টোরড প্রোসিডিউর ব্যবহার করতে পারেন যা আলাদা আলাদা অপারেশন সম্পাদন করবে।
3.1 Multiple Stored Procedures Example
আপনি যদি ব্যবহারকারী অর্ডার করার সময় বিভিন্ন অপারেশন (যেমন, ইনভেন্টরি আপডেট, পেমেন্ট প্রসেসিং) করতে চান, তবে আপনি একাধিক স্টোরড প্রোসিডিউর ব্যবহার করতে পারেন। এখানে একটি উদাহরণ:
DELIMITER
-- Stored Procedure for processing payment
CREATE PROCEDURE processPayment(IN p_user_id INT, IN p_amount DECIMAL(10,2))
BEGIN
INSERT INTO payments (user_id, amount, payment_date) VALUES (p_user_id, p_amount, NOW());
END $$
DELIMITER ;
এখানে দুটি স্টোরড প্রোসিডিউর:
- updateInventory - এটি ইনভেন্টরি আপডেট করবে, যেখানে প্রোডাক্টের স্টক কমানো হবে।
- processPayment - এটি পেমেন্ট ডেটা সংরক্ষণ করবে।
3.2 Java Code for Multiple Stored Procedures
Java কোডের মাধ্যমে আপনি একাধিক স্টোরড প্রোসিডিউর একসাথে ট্রানজেকশনে কল করতে পারেন:
import java.sql.*;
public class ComplexTransactionMultipleProcedures {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database";
String username = "root";
String password = "your_password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
connection.setAutoCommit(false); // ট্রানজেকশন শুরু করা
// প্রথম স্টোরড প্রোসিডিউর কল করা: updateInventory
String sql1 = "{CALL updateInventory(?, ?)}";
try (CallableStatement stmt1 = connection.prepareCall(sql1)) {
stmt1.setInt(1, 101); // product_id
stmt1.setInt(2, 5); // quantity
stmt1.execute();
}
// দ্বিতীয় স্টোরড প্রোসিডিউর কল করা: processPayment
String sql2 = "{CALL processPayment(?, ?)}";
try (CallableStatement stmt2 = connection.prepareCall(sql2)) {
stmt2.setInt(1, 1); // user_id
stmt2.setBigDecimal(2, new BigDecimal("150.00")); // amount
stmt2.execute();
}
// যদি সবকিছু ঠিক থাকে, কমিট করা
connection.commit();
System.out.println("Transaction completed successfully.");
} catch (SQLException e) {
// কোনো সমস্যা হলে রোলব্যাক করা
try {
connection.rollback();
System.out.println("Transaction rolled back.");
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}
}
}
এই কোডে:
- একাধিক স্টোরড প্রোসিডিউর কল করা হচ্ছে updateInventory এবং processPayment।
- যদি কোনো প্রোসিডিউর ব্যর্থ হয়, পুরো ট্রানজেকশন রোলব্যাক করা হবে।
সারাংশ
Java MySQL অ্যাপ্লিকেশনে Stored Procedures এর সাথে Complex Transactions ব্যবহারের মাধ্যমে আপনি একাধিক SQL অপারেশন একসাথে এবং সুরক্ষিতভাবে পরিচালনা করতে পারেন। Stored Procedures আপনাকে ডেটাবেস লজিককে কেন্দ্রীয়ভাবে পরিচালনা করার সুযোগ দেয়, যা কোডের পুনঃব্যবহারযোগ্যতা এবং পারফরম্যান্স বাড়ায়। Java দিয়ে আপনি CallableStatement ব্যবহার করে এই স্টোরড প্রোসিডিউরগুলো কল করতে পারেন এবং ট্রানজেকশন সঠিকভাবে কমপ্লিট বা রোলব্যাক করতে পারেন।
Read more