JDBC - Giao dịch

Nếu Kết nối JDBC của bạn ở chế độ tự động cam kết , theo mặc định, thì mọi câu lệnh SQL được cam kết với cơ sở dữ liệu sau khi hoàn thành.

Điều đó có thể ổn đối với các ứng dụng đơn giản, nhưng có ba lý do tại sao bạn có thể muốn tắt tính năng tự động cam kết và quản lý các giao dịch của riêng mình -

  • Để tăng hiệu suất.

  • Để duy trì tính toàn vẹn của các quy trình kinh doanh.

  • Để sử dụng các giao dịch phân tán.

Các giao dịch cho phép bạn kiểm soát nếu và khi nào, các thay đổi được áp dụng cho cơ sở dữ liệu. Nó coi một câu lệnh SQL đơn hoặc một nhóm câu lệnh SQL như một đơn vị logic và nếu bất kỳ câu lệnh nào không thành công, toàn bộ giao dịch sẽ không thành công.

Để bật hỗ trợ giao dịch thủ công thay vì chế độ tự động cam kết mà trình điều khiển JDBC sử dụng theo mặc định, hãy sử dụng đối tượng Kết nối củasetAutoCommit()phương pháp. Nếu bạn chuyển một boolean false cho setAutoCommit (), bạn sẽ tắt tính năng tự động cam kết. Bạn có thể chuyển một boolean true để bật lại.

Ví dụ: nếu bạn có đối tượng Kết nối có tên là conn, hãy viết mã như sau để tắt tính năng tự động cam kết -

conn.setAutoCommit(false);

Cam kết & Khôi phục

Khi bạn đã hoàn tất các thay đổi của mình và bạn muốn thực hiện các thay đổi, hãy gọi commit() phương thức trên đối tượng kết nối như sau:

conn.commit( );

Nếu không, để khôi phục các bản cập nhật cho cơ sở dữ liệu được thực hiện bằng Kết nối có tên conn, hãy sử dụng mã sau:

conn.rollback( );

Ví dụ sau minh họa việc sử dụng đối tượng commit và rollback:

try{
   //Assume a valid connection object conn
   conn.setAutoCommit(false);
   Statement stmt = conn.createStatement();
   
   String SQL = "INSERT INTO Employees  " +
                "VALUES (106, 20, 'Rita', 'Tez')";
   stmt.executeUpdate(SQL);  
   //Submit a malformed SQL statement that breaks
   String SQL = "INSERTED IN Employees  " +
                "VALUES (107, 22, 'Sita', 'Singh')";
   stmt.executeUpdate(SQL);
   // If there is no error.
   conn.commit();
}catch(SQLException se){
   // If there is any error.
   conn.rollback();
}

Trong trường hợp này, không câu lệnh INSERT nào ở trên thành công và mọi thứ sẽ được khôi phục.

Để hiểu rõ hơn, chúng ta hãy nghiên cứu Quy tắc cam kết - Ví dụ .

Sử dụng Savepoints

Giao diện JDBC 3.0 Savepoint mới cung cấp cho bạn khả năng kiểm soát giao dịch bổ sung. Hầu hết các DBMS hiện đại, hỗ trợ các điểm lưu trong môi trường của chúng, chẳng hạn như PL / SQL của Oracle.

Khi bạn đặt điểm lưu, bạn xác định điểm khôi phục hợp lý trong một giao dịch. Nếu lỗi xảy ra sau một điểm lưu, bạn có thể sử dụng phương pháp khôi phục để hoàn tác tất cả các thay đổi hoặc chỉ những thay đổi được thực hiện sau điểm lưu.

Đối tượng Connection có hai phương pháp mới giúp bạn quản lý các điểm lưu -

  • setSavepoint(String savepointName):Xác định một điểm lưu mới. Nó cũng trả về một đối tượng Savepoint.

  • releaseSavepoint(Savepoint savepointName):Xóa một điểm lưu. Lưu ý rằng nó yêu cầu một đối tượng Savepoint làm tham số. Đối tượng này thường là một điểm lưu được tạo bởi phương thức setSavepoint ().

Chỉ có một rollback (String savepointName) phương thức này sẽ quay trở lại hoạt động trở lại điểm lưu được chỉ định.

Ví dụ sau minh họa việc sử dụng một đối tượng Savepoint:

try{
   //Assume a valid connection object conn
   conn.setAutoCommit(false);
   Statement stmt = conn.createStatement();
   
   //set a Savepoint
   Savepoint savepoint1 = conn.setSavepoint("Savepoint1");
   String SQL = "INSERT INTO Employees " +
                "VALUES (106, 20, 'Rita', 'Tez')";
   stmt.executeUpdate(SQL);  
   //Submit a malformed SQL statement that breaks
   String SQL = "INSERTED IN Employees " +
                "VALUES (107, 22, 'Sita', 'Tez')";
   stmt.executeUpdate(SQL);
   // If there is no error, commit the changes.
   conn.commit();

}catch(SQLException se){
   // If there is any error.
   conn.rollback(savepoint1);
}

Trong trường hợp này, không câu lệnh INSERT nào ở trên thành công và mọi thứ sẽ được khôi phục.

Để hiểu rõ hơn, chúng ta hãy nghiên cứu các Điểm lưu - Mã ví dụ .