Thẻ <sql:transaction> được sử dụng để nhóm các thẻ <sql:query> và <sql:update> thành các giao dịch. Bạn có thể đặt bao nhiêu thẻ <sql:query> và <sql:update> làm câu lệnh bên trong thẻ <sql:transaction> để tạo một giao dịch duy nhất.
Nó đảm bảo rằng các sửa đổi cơ sở dữ liệu được thực hiện bởi các hành động lồng nhau hoặc được commit hoặc roll back nếu một ngoại lệ được ném bởi bất kỳ hành động lồng nào.
Các thuộc tính
Thẻ <sql:transaction> có các thuộc tính sau:
| Thuộc tính | Mô tả | Bắt buộc | Mặc định |
|---|---|---|---|
| dataSource | Kết nối cơ sở dữ liệu sử dụng (ghi đè mặc định) | Không | Cơ sở dữ liệu mặc định |
| isolation | Cô lập giao dịch (READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, hoặc SERIALIZABLE) | Không | Mặc định của cơ sở dữ liệu |
Ví dụ
Để bắt đầu với khái niệm cơ bản, hãy tạo một bảng Students trong cơ sở dữ liệu TEST và tạo một vài bản ghi như sau:
Bước 1
Mở Command Prompt và chuyển đến thư mục cài đặt như sau:
C:\> C:\>cd Program Files\MySQL\bin C:\Program Files\MySQL\bin>
Bước 2
Đăng nhập vào cơ sở dữ liệu như sau:
C:\Program Files\MySQL\bin>mysql -u root -p Enter password: ******** mysql>
Bước 3
Tạo bảng Employee trong cơ sở dữ liệu TEST như sau:
mysql> use TEST; mysql> create table Students ( id int not null, first varchar (255), last varchar (255), dob date ); Query OK, 0 rows affected (0.08 sec) mysql>
Tạo bản ghi dữ liệu
Chúng ta sẽ tạo một vài bản ghi trong bảng Employee như sau:
mysql> INSERT INTO Students VALUES (100, 'Zara', 'Ali', '2002/05/16'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO Students VALUES (101, 'Mahnaz', 'Fatma', '1978/11/28'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO Students VALUES (102, 'Zaid', 'Khan', '1980/10/10'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO Students VALUES (103, 'Sumit', 'Mittal', '1971/05/08'); Query OK, 1 row affected (0.00 sec) mysql>
Bây giờ hãy viết một JSP sử dụng thẻ <sql:update> cùng với <sql:transaction> để thực thi câu lệnh SQL UPDATE. Code bên trong thẻ <sql:transaction> sẽ được thực thi hoàn toàn hoặc không thực thi gì cả:
<%@ page import = "java.io.*,java.util.*,java.sql.*"%>
<%@ page import = "javax.servlet.http.*,javax.servlet.*"%>
<%@ page import = "java.util.Date,java.text.*" %>
<%@ taglib uri = "https://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri = "https://java.sun.com/jsp/jstl/sql" prefix = "sql"%>
<html>
<head>
<title>Thẻ JSTL sql:transaction</title>
</head>
<body>
<sql:setDataSource var = "snapshot" driver = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://localhost/TEST" user = "root" password = "cohondob"/>
<% Date DoB = new Date("2001/12/16"); int studentId = 100; %>
<sql:transaction dataSource = "${snapshot}">
<sql:update var = "count">
UPDATE Students SET last = 'Ali' WHERE Id = 102
</sql:update>
<sql:update var = "count">
UPDATE Students SET last = 'Shah' WHERE Id = 103
</sql:update>
<sql:update var = "count">
INSERT INTO Students
VALUES (104,'Nuha', 'Ali', '2010/05/26');
</sql:update>
</sql:transaction>
<sql:query dataSource = "${snapshot}" var = "result">
SELECT * from Students;
</sql:query>
<table border = "1" width = "100%">
<tr>
<th>Emp ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>DoB</th>
</tr>
<c:forEach var = "row" items = "${result.rows}">
<tr>
<td> <c:out value = "${row.id}"/></td>
<td> <c:out value = "${row.first}"/></td>
<td> <c:out value = "${row.last}"/></td>
<td> <c:out value = "${row.dob}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
Truy cập JSP trên, kết quả sau sẽ được hiển thị:
+-------------+----------------+-----------------+-----------------+ | Emp ID | First Name | Last Name | DoB | +-------------+----------------+-----------------+-----------------+ | 100 | Zara | Ali | 2001-12-16 | | 101 | Mahnaz | Fatma | 1978-11-28 | | 102 | Zaid | Ali | 1980-10-10 | | 103 | Sumit | Mittal | 1971-05-08 | | 104 | Nuha | Ali | 2010-05-26 | +-------------+----------------+-----------------+-----------------+