
- MySQL 基礎
- MySQL - 首頁
- MySQL - 簡介
- MySQL - 特性
- MySQL - 版本
- MySQL - 變數
- MySQL - 安裝
- MySQL - 管理
- MySQL - PHP 語法
- MySQL - Node.js 語法
- MySQL - Java 語法
- MySQL - Python 語法
- MySQL - 連線
- MySQL - Workbench
- MySQL 資料庫
- MySQL - 建立資料庫
- MySQL - 刪除資料庫
- MySQL - 選擇資料庫
- MySQL - 顯示資料庫
- MySQL - 複製資料庫
- MySQL - 資料庫匯出
- MySQL - 資料庫匯入
- MySQL - 資料庫資訊
- MySQL 使用者
- MySQL - 建立使用者
- MySQL - 刪除使用者
- MySQL - 顯示使用者
- MySQL - 修改密碼
- MySQL - 授權
- MySQL - 顯示許可權
- MySQL - 收回許可權
- MySQL - 鎖定使用者帳戶
- MySQL - 解鎖使用者帳戶
- MySQL 表
- MySQL - 建立表
- MySQL - 顯示錶
- MySQL - 修改表
- MySQL - 重命名錶
- MySQL - 克隆表
- MySQL - 截斷表
- MySQL - 臨時表
- MySQL - 修復表
- MySQL - 描述表
- MySQL - 新增/刪除列
- MySQL - 顯示列
- MySQL - 重新命名列
- MySQL - 表鎖定
- MySQL - 刪除表
- MySQL - 派生表
- MySQL 查詢
- MySQL - 查詢
- MySQL - 約束
- MySQL - INSERT 查詢
- MySQL - SELECT 查詢
- MySQL - UPDATE 查詢
- MySQL - DELETE 查詢
- MySQL - REPLACE 查詢
- MySQL - INSERT IGNORE
- MySQL - INSERT ON DUPLICATE KEY UPDATE
- MySQL - INSERT INTO SELECT
- MySQL 運算子和子句
- MySQL - WHERE 子句
- MySQL - LIMIT 子句
- MySQL - DISTINCT 子句
- MySQL - ORDER BY 子句
- MySQL - GROUP BY 子句
- MySQL - HAVING 子句
- MySQL - AND 運算子
- MySQL - OR 運算子
- MySQL - LIKE 運算子
- MySQL - IN 運算子
- MySQL - ANY 運算子
- MySQL - EXISTS 運算子
- MySQL - NOT 運算子
- MySQL - NOT EQUAL 運算子
- MySQL - IS NULL 運算子
- MySQL - IS NOT NULL 運算子
- MySQL - BETWEEN 運算子
- MySQL - UNION 運算子
- MySQL - UNION vs UNION ALL
- MySQL - MINUS 運算子
- MySQL - INTERSECT 運算子
- MySQL - INTERVAL 運算子
- MySQL 連線
- MySQL - 使用連線
- MySQL - INNER JOIN
- MySQL - LEFT JOIN
- MySQL - RIGHT JOIN
- MySQL - CROSS JOIN
- MySQL - FULL JOIN
- MySQL - 自連線
- MySQL - DELETE JOIN
- MySQL - UPDATE JOIN
- MySQL - UNION vs JOIN
- MySQL 觸發器
- MySQL - 觸發器
- MySQL - 建立觸發器
- MySQL - 顯示觸發器
- MySQL - 刪除觸發器
- MySQL - BEFORE INSERT 觸發器
- MySQL - AFTER INSERT 觸發器
- MySQL - BEFORE UPDATE 觸發器
- MySQL - AFTER UPDATE 觸發器
- MySQL - BEFORE DELETE 觸發器
- MySQL - AFTER DELETE 觸發器
- MySQL 資料型別
- MySQL - 資料型別
- MySQL - VARCHAR
- MySQL - BOOLEAN
- MySQL - ENUM
- MySQL - DECIMAL
- MySQL - INT
- MySQL - FLOAT
- MySQL - BIT
- MySQL - TINYINT
- MySQL - BLOB
- MySQL - SET
- MySQL 正則表示式
- MySQL - 正則表示式
- MySQL - RLIKE 運算子
- MySQL - NOT LIKE 運算子
- MySQL - NOT REGEXP 運算子
- MySQL - regexp_instr() 函式
- MySQL - regexp_like() 函式
- MySQL - regexp_replace() 函式
- MySQL - regexp_substr() 函式
- MySQL 函式和運算子
- MySQL - 日期和時間函式
- MySQL - 算術運算子
- MySQL - 數值函式
- MySQL - 字串函式
- MySQL - 聚合函式
- MySQL 其他概念
- MySQL - NULL 值
- MySQL - 事務
- MySQL - 使用序列
- MySQL - 處理重複項
- MySQL - SQL 注入
- MySQL - 子查詢
- MySQL - 註釋
- MySQL - 檢查約束
- MySQL - 儲存引擎
- MySQL - 將表匯出到 CSV 檔案
- MySQL - 將 CSV 檔案匯入資料庫
- MySQL - UUID
- MySQL - 公共表表達式
- MySQL - ON DELETE CASCADE
- MySQL - Upsert
- MySQL - 水平分割槽
- MySQL - 垂直分割槽
- MySQL - 遊標
- MySQL - 儲存函式
- MySQL - SIGNAL
- MySQL - RESIGNAL
- MySQL - 字元集
- MySQL - 排序規則
- MySQL - 萬用字元
- MySQL - 別名
- MySQL - ROLLUP
- MySQL - 今日日期
- MySQL - 字面量
- MySQL - 儲存過程
- MySQL - EXPLAIN
- MySQL - JSON
- MySQL - 標準差
- MySQL - 查詢重複記錄
- MySQL - 刪除重複記錄
- MySQL - 選擇隨機記錄
- MySQL - SHOW PROCESSLIST
- MySQL - 更改列型別
- MySQL - 重置自動遞增
- MySQL - COALESCE() 函式
- MySQL 有用資源
- MySQL - 有用函式
- MySQL - 語句參考
- MySQL - 快速指南
- MySQL - 有用資源
- MySQL - 討論
MySQL - 事務
MySQL 事務
MySQL 事務是一組按順序執行的資料庫操作,這些操作被視為一個單一的工作單元。換句話說,除非組中的每個操作都成功,否則事務永遠不會完成。如果事務中的任何操作失敗,整個事務都將失敗。
實際上,您可以將許多SQL查詢組合成一個組,並將它們作為一個事務的一部分一起執行。這將確保不會丟失資料或SQL查詢執行失敗。
事務的特性
事務有四個標準特性,通常用首字母縮寫詞ACID表示:
原子性 - 這確保事務中的所有操作都被視為一個單元。事務中的所有操作要麼全部成功完成,要麼全部不完成。如果事務的任何部分失敗,則整個事務將回滾,資料庫將保持其原始狀態。
一致性 - 這確保資料庫在成功提交事務後會正確更改狀態。
隔離性 - 這使事務能夠獨立執行,並且彼此透明。
永續性 - 這確保一旦事務提交,其對資料庫的影響是永久性的,並且能夠經受系統故障(例如,電源中斷、硬體故障)。
MySQL 中的事務語句
在MySQL中,事務以START TRANSACTION、BEGIN或BEGIN WORK語句開始,並以COMMIT或ROLLBACK語句結束。在開始和結束語句之間執行的MySQL命令構成事務的主體。
要啟用或停用事務中的自動提交選項,可以使用SET AUTOCOMMIT命令。要啟用自動提交,將命令設定為'1'或'ON',要停用它,將命令設定為'0'或'OFF'。
COMMIT 命令
COMMIT 命令是 MySQL 中的一個事務控制命令。發出此命令時,它將最終確定在事務中直至該點對資料庫表所做的更改,使這些更改永久生效。因此,這些更改對 MySQL 中的其他活動會話可見。
語法
以下是用於在 MySQL 中執行 COMMIT 命令的語法:
COMMIT;
示例
讓我們使用以下查詢建立一個名為 CUSTOMERS 的表:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
我們將一些記錄插入到上面建立的表中:
INSERT INTO CUSTOMERS VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00), (2, 'Khilan', 25, 'Delhi', 1500.00), (3, 'Kaushik', 23, 'Kota', 2000.00), (4, 'Chaitali', 25, 'Mumbai', 6500.00), (5, 'Hardik', 27, 'Bhopal', 8500.00), (6, 'Komal', 22, 'Hyderabad', 4500.00), (7, 'Muffy', 24, 'Indore', 10000.00);
顯示的 CUSTOMERS 表如下:
ID | 姓名 (NAME) | 年齡 (AGE) | 地址 (ADDRESS) | 工資 (SALARY) |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | Hyderabad | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
使用以下查詢,啟動事務並刪除 AGE 為 25 的 CUSTOMERS 表中的記錄,然後提交資料庫中的更改:
START TRANSACTION; DELETE FROM CUSTOMERS WHERE AGE = 25; COMMIT;
驗證
表中的兩行將被刪除。要進行驗證,請使用以下 SELECT 語句顯示修改後的 CUSTOMERS 表:
SELECT * FROM CUSTOMERS;
獲得的輸出如下:
ID | 姓名 (NAME) | 年齡 (AGE) | 地址 (ADDRESS) | 工資 (SALARY) |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | MP | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
AUTOCOMMIT 命令
您可以透過設定名為AUTOCOMMIT的會話變數來控制事務的行為。如果 AUTOCOMMIT 設定為 1(預設值),則每個 SQL 語句(在事務內或事務外)都被視為一個完整的事務,並在其完成時預設提交。
當 AUTOCOMMIT 設定為 0 時,透過發出SET AUTOCOMMIT = 0命令,後續的一系列語句將像一個事務一樣,在發出顯式的 COMMIT 語句之前不會提交任何活動。
ROLLBACK 命令
ROLLBACK 命令是一個事務型命令,用於撤銷尚未儲存(提交)到資料庫的事務中所做的更改。此命令只能撤銷自上次執行 COMMIT 或 ROLLBACK 語句以來進行的事務的影響。
語法
以下是 MySQL 中 ROLLBACK 命令的語法:
ROLLBACK;
示例
使用以下查詢,刪除 CUSTOMERS 表中 AGE 為 25 的記錄,然後回滾資料庫中的更改:
DELETE FROM CUSTOMERS WHERE AGE = 25; ROLLBACK;
驗證
表將不會受到影響。要驗證,請使用以下 SELECT 語句顯示修改後的 CUSTOMERS 表:
SELECT * FROM CUSTOMERS;
獲得的表如下:
ID | 姓名 (NAME) | 年齡 (AGE) | 地址 (ADDRESS) | 工資 (SALARY) |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | Hyderabad | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
您必須記住,ROLLBACK 僅在事務內有效。如果您嘗試在不啟動事務的情況下執行它,則更改將不會被撤銷。
SAVEPOINT 命令
SAVEPOINT 是 MySQL 事務中一個邏輯回滾點。
執行 ROLLBACK 命令時,它會將事務中所做的更改恢復到上次 COMMIT 或事務的開始(如果之前沒有 COMMIT)。但是,透過在事務中建立儲存點,您可以建立可以部分回滾事務的特定點。您可以在事務中建立多個儲存點,以便在兩次提交之間擁有多個回滾選項。
語法
在事務中建立 SAVEPOINT 命令的語法如下所示:
SAVEPOINT SAVEPOINT_NAME;
回滾到已建立的 SAVEPOINT 的語法如下:
ROLLBACK TO SAVEPOINT_NAME;
示例
在以下示例中,您計劃從 CUSTOMERS 表中刪除三條不同的記錄,並在每次刪除之前建立 SAVEPOINT。這允許您隨時回滾到任何 SAVEPOINT,以將其相應的資料恢復到其原始狀態:
SAVEPOINT SP1; Query OK, 0 rows affected (0.00 sec) DELETE FROM CUSTOMERS WHERE ID=1; Query OK, 1 row affected (0.01 sec) SAVEPOINT SP2; Query OK, 0 rows affected (0.00 sec) DELETE FROM CUSTOMERS WHERE ID=2; Query OK, 0 rows affected (0.00 sec) SAVEPOINT SP3; Query OK, 0 rows affected (0.00 sec) DELETE FROM CUSTOMERS WHERE ID=3; Query OK, 1 row affected (0.01 sec)
現在,假設您已經改變主意,並決定回滾到標識為 SP2 的 SAVEPOINT。由於 SP2 是在第一次刪除後建立的,此操作將撤消最後兩次刪除:
ROLLBACK TO SP2;
驗證
如果您使用以下 SELECT 語句顯示 CUSTOMERS 表,您會注意到只進行了第一次刪除,因為您回滾到了 SP2:
SELECT * FROM CUSTOMERS;
獲得的結果如下所示:
ID | 姓名 (NAME) | 年齡 (AGE) | 地址 (ADDRESS) | 工資 (SALARY) |
---|---|---|---|---|
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | Hyderabad | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
MySQL 中的事務安全表型別
在 MySQL 中,並非所有表型別都原生支援事務。要有效地使用事務,您應該以特定方式建立表。雖然有多種表型別可用,但最常用的事務安全表型別是 InnoDB。
要啟用 InnoDB 表支援,您可能需要在 MySQL 原始碼編譯期間使用特定的編譯引數。如果您的 MySQL 版本不包含 InnoDB 支援,您可以請求您的網際網路服務提供商 (ISP) 提供包含 InnoDB 支援的 MySQL 版本,或者您可以下載並安裝適用於 Windows 或 Linux/UNIX 的 **MySQL-Max 二進位制發行版** 以在開發環境中使用 InnoDB 表。
如果您的 MySQL 安裝支援 InnoDB 表,您可以按如下所示建立 InnoDB 表:
CREATE TABLE tcount_tbl ( tutorial_author varchar(40) NOT NULL, tutorial_count INT ) ENGINE = InnoDB;
獲得的輸出如下:
Query OK, 0 rows affected (0.05 sec)
您也可以使用其他表型別,例如 **GEMINI** 或 **BDB**,但這取決於您的安裝是否支援這兩種表型別。
使用客戶端程式進行事務處理
我們還可以使用客戶端程式執行事務。
語法
要透過 PHP 程式執行事務,我們需要使用 **mysqli** 函式 **query()** 執行三個語句:“START TRANSACTION”、“COMMIT”和“ROLLBACK”,如下所示:
$sql = "START TRANSACTION"; $mysqli->query($sql); ... $sql = "COMMIT"; $mysqli->query($sql); ... $sql = "ROLLBACK"; $mysqli->query($sql); ...
要透過 JavaScript 程式執行事務,我們需要使用 **mysql2** 庫的 **query()** 函式執行三個語句:“START TRANSACTION”、“COMMIT”和“ROLLBACK”,如下所示:
sql = "START TRANSACTION"; con.query(sql); ... sql = "COMMIT"; con.query(sql); ... sql = "ROLLBACK"; con.query(sql); ...
要透過 Java 程式執行事務,我們需要使用 **JDBC** 函式 **execute()** 執行三個語句:“START TRANSACTION”、“COMMIT”和“ROLLBACK”,如下所示:
String sql = "START TRANSACTION"; statement.execute(sql); ... String sql = "COMMIT"; statement.execute(sql); ... String sql = "ROLLBACK"; statement.execute(sql); ...
要透過 Python 程式執行事務,我們需要使用 **MySQL Connector/Python** 的 **execute()** 函式執行三個語句:“START TRANSACTION”、“COMMIT”和“ROLLBACK”,如下所示:
connection.start_transaction() ... connection.commit() ... connection.rollback() ...
示例
以下是程式:
$dbhost = 'localhost'; $dbuser = 'root'; $dbpass = 'password'; $db = 'TUTORIALS'; $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db); if ($mysqli->connect_errno) { printf("Connect failed: %s
", $mysqli->connect_error); exit(); } //printf('Connected successfully.
'); //start transaction $sql = "START TRANSACTION"; if($mysqli->query($sql)){ printf("Transaction started....!\n"); } //print table record $sql = "SELECT * FROM CUSTOMERS"; if($result = $mysqli->query($sql)){ printf("Table records after transaction...!\n"); while($row = mysqli_fetch_array($result)){ printf("ID %d, NAME %s, AGE %d, ADDRESS %s, SALARY %f", $row['ID'], $row['NAME'], $row['AGE'], $row['ADDRESS'], $row['SALARY']); printf("\n"); } } //let's delete some records $sql = "DELETE FROM CUSTOMERS WHERE AGE = 25"; if($mysqli->query($sql)){ printf("Records with age = 25 are deleted successfully....!\n"); } //lets delete some more records.. $sql = "DELETE FROM CUSTOMERS WHERE SALARY = 2000"; if($mysqli->query($sql)){ printf("Records with salary = 2000 are deleted successfully....!\n"); } printf("Table data after second delete (before rollback)...!\n"); $sql = "SELECT * FROM CUSTOMERS"; if($result = $mysqli->query($sql)){ while($row = mysqli_fetch_array($result)){ printf("ID %d, NAME %s, AGE %d, ADDRESS %s, SALARY %f", $row['ID'], $row['NAME'], $row['AGE'], $row['ADDRESS'], $row['SALARY']); printf("\n"); } } $sql = "ROLLBACK"; if($mysqli->query($sql)){ printf("Transaction rollbacked successfully..!\n"); } printf("Table data after rollback: \n"); $sql = "SELECT * FROM CUSTOMERS"; if($result = $mysqli->query($sql)){ while($row = mysqli_fetch_array($result)){ printf("ID %d, NAME %s, AGE %d, ADDRESS %s, SALARY %f", $row['ID'], $row['NAME'], $row['AGE'], $row['ADDRESS'], $row['SALARY']); printf("\n"); } } if($mysqli->error){ printf("Error message: ", $mysqli->error); } $mysqli->close();
輸出
獲得的輸出如下所示:
Transaction started....! Table records after transaction...! ID 1, NAME Ramesh, AGE 32, ADDRESS Ahmedabad, SALARY 2000.000000 ID 2, NAME Khilan, AGE 25, ADDRESS Delhi, SALARY 1500.000000 ID 3, NAME kaushik, AGE 23, ADDRESS Kota, SALARY 2000.000000 ID 4, NAME Chaitali, AGE 25, ADDRESS Mumbai, SALARY 6500.000000 ID 5, NAME Hardik, AGE 27, ADDRESS Bhopal, SALARY 8500.000000 ID 6, NAME Komal, AGE 22, ADDRESS MP, SALARY 4500.000000 ID 7, NAME Muffy, AGE 24, ADDRESS Indore, SALARY 10000.000000 Records with age = 25 are deleted successfully....! Records with salary = 2000 are deleted successfully....! Table data after second delete (before rollback)...! ID 5, NAME Hardik, AGE 27, ADDRESS Bhopal, SALARY 8500.000000 ID 6, NAME Komal, AGE 22, ADDRESS MP, SALARY 4500.000000 ID 7, NAME Muffy, AGE 24, ADDRESS Indore, SALARY 10000.000000 Transaction rollbacked successfully..! Table data after rollback: ID 1, NAME Ramesh, AGE 32, ADDRESS Ahmedabad, SALARY 2000.000000 ID 2, NAME Khilan, AGE 25, ADDRESS Delhi, SALARY 1500.000000 ID 3, NAME kaushik, AGE 23, ADDRESS Kota, SALARY 2000.000000 ID 4, NAME Chaitali, AGE 25, ADDRESS Mumbai, SALARY 6500.000000 ID 5, NAME Hardik, AGE 27, ADDRESS Bhopal, SALARY 8500.000000 ID 6, NAME Komal, AGE 22, ADDRESS MP, SALARY 4500.000000 ID 7, NAME Muffy, AGE 24, ADDRESS Indore, SALARY 10000.000000
var mysql = require('mysql2'); var con = mysql.createConnection({ host:"localhost", user:"root", password:"password" }); //Connecting to MySQL con.connect(function(err) { if (err) throw err; // console.log("Connected successfully...!"); // console.log("--------------------------"); sql = "USE TUTORIALS"; con.query(sql); sql = "START TRANSACTION"; con.query(sql, function(err, result){ if (err) throw err; console.log("Transaction started....!"); }); sql = "SELECT * FROM CUSTOMERS"; con.query(sql, function(err, result){ console.log("Table records after transaction...!"); if (err) throw err; console.log(result); }); //delete record sql = "DELETE FROM CUSTOMERS WHERE AGE = 25"; con.query(sql, function(err, result){ if (err) throw err; console.log("Records with age = 25 are deleted successfully....!"); }); //now lets delete more records sql = "DELETE FROM CUSTOMERS WHERE SALARY = 2000"; con.query(sql, function(err, result){ if (err) throw err; console.log("Records with salary = 2000 are deleted successfully....!"); }); //print table records before rollback; sql = "SELECT * FROM CUSTOMERS"; con.query(sql, function(err, result){ console.log("Table Data After Second Delete (Before Rollback)"); if (err) throw err; console.log(result); }); //rollback the transaction sql = "ROLLBACK"; con.query(sql, function(err, result){ if (err) throw err; console.log("Transaction rollbacked successfully..!"); }); //print table data after rollback; sql = "SELECT * FROM CUSTOMERS"; con.query(sql, function(err, result){ console.log("Table records after rollback...!"); if (err) throw err; console.log(result); }); });
輸出
獲得的輸出如下所示:
Transaction started....! Table records after transaction...! [ { ID: 1, NAME: 'Ramesh', AGE: 32, ADDRESS: 'Ahmedabad', SALARY: '2000.00' }, { ID: 2, NAME: 'Khilan', AGE: 25, ADDRESS: 'Delhi', SALARY: '1500.00' }, { ID: 3, NAME: 'kaushik', AGE: 23, ADDRESS: 'Kota', SALARY: '2000.00' }, { ID: 4, NAME: 'Chaitali', AGE: 25, ADDRESS: 'Mumbai', SALARY: '6500.00' }, { ID: 5, NAME: 'Hardik', AGE: 27, ADDRESS: 'Bhopal', SALARY: '8500.00' }, { ID: 6, NAME: 'Komal', AGE: 22, ADDRESS: 'MP', SALARY: '4500.00' }, { ID: 7, NAME: 'Muffy', AGE: 24, ADDRESS: 'Indore', SALARY: '10000.00' } ] Records with age = 25 are deleted successfully....! Records with salary = 2000 are deleted successfully....! Table Data After Second Delete (Before Rollback) [ { ID: 5, NAME: 'Hardik', AGE: 27, ADDRESS: 'Bhopal', SALARY: '8500.00' }, { ID: 6, NAME: 'Komal', AGE: 22, ADDRESS: 'MP', SALARY: '4500.00' }, { ID: 7, NAME: 'Muffy', AGE: 24, ADDRESS: 'Indore', SALARY: '10000.00' } ] Transaction rollbacked successfully..! Table records after rollback...! [ { ID: 1, NAME: 'Ramesh', AGE: 32, ADDRESS: 'Ahmedabad', SALARY: '2000.00' }, { ID: 2, NAME: 'Khilan', AGE: 25, ADDRESS: 'Delhi', SALARY: '1500.00' }, { ID: 3, NAME: 'kaushik', AGE: 23, ADDRESS: 'Kota', SALARY: '2000.00' }, { ID: 4, NAME: 'Chaitali', AGE: 25, ADDRESS: 'Mumbai', SALARY: '6500.00' }, { ID: 5, NAME: 'Hardik', AGE: 27, ADDRESS: 'Bhopal', SALARY: '8500.00' }, { ID: 6, NAME: 'Komal', AGE: 22, ADDRESS: 'MP', SALARY: '4500.00' }, { ID: 7, NAME: 'Muffy', AGE: 24, ADDRESS: 'Indore', SALARY: '10000.00' } ]
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class Transaction { public static void main(String[] args) { String url = "jdbc:mysql://:3306/TUTORIALS"; String user = "root"; String password = "password"; ResultSet rs; try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection con = DriverManager.getConnection(url, user, password); Statement st = con.createStatement(); //System.out.println("Database connected successfully...!"); //start transaction String sql = "START TRANSACTION"; st.execute(sql); System.out.println("Transaction started....!"); //print customers record after starting transaction String sql1 = "SELECT * FROM CUSTOMERS"; rs = st.executeQuery(sql1); System.out.println("Table records after starting transaction: "); while(rs.next()) { String id = rs.getString("id"); String name = rs.getString("name"); String age = rs.getString("age"); String address = rs.getString("address"); String salary = rs.getString("salary"); System.out.println("Id: " + id + ", Name: " + name + ", Age: " + age + ", Address: " + address + ", Salary: " + salary); } //lets delete some records String sql2 = "DELETE FROM CUSTOMERS WHERE AGE = 25"; st.execute(sql2); System.out.println("Customer with age 25 deleted successfully...!"); String sql4 = "DELETE FROM CUSTOMERS WHERE SALARY = 2000"; st.execute(sql4); System.out.println("Customer with age 2000 deleted successfully...!"); String sql5 = "SELECT * FROM CUSTOMERS"; rs = st.executeQuery(sql5); System.out.println("Table records before rollback: "); while(rs.next()) { String id = rs.getString("id"); String name = rs.getString("name"); String age = rs.getString("age"); String address = rs.getString("address"); String salary = rs.getString("salary"); System.out.println("Id: " + id + ", Name: " + name + ", Age: " + age + ", Address: " + address + ", Salary: " + salary); } //lets roll-back the transaction String r = "ROLLBACK"; st.execute(r); System.out.println("Transaction rollbacked successfully...!"); String sql6 = "SELECT * FROM CUSTOMERS"; rs = st.executeQuery(sql6); System.out.println("Table records after rollback: "); while(rs.next()) { String id = rs.getString("id"); String name = rs.getString("name"); String age = rs.getString("age"); String address = rs.getString("address"); String salary = rs.getString("salary"); System.out.println("Id: " + id + ", Name: " + name + ", Age: " + age + ", Address: " + address + ", Salary: " + salary); } }catch(Exception e) { e.printStackTrace(); } } }
輸出
獲得的輸出如下所示:
Transaction started....! Table records after starting transaction: Id: 1, Name: Ramesh, Age: 32, Address: Ahmedabad, Salary: 2000.00 Id: 2, Name: Khilan, Age: 25, Address: Delhi, Salary: 1500.00 Id: 3, Name: kaushik, Age: 23, Address: Kota, Salary: 2000.00 Id: 4, Name: Chaitali, Age: 25, Address: Mumbai, Salary: 6500.00 Id: 5, Name: Hardik, Age: 27, Address: Bhopal, Salary: 8500.00 Id: 6, Name: Komal, Age: 22, Address: MP, Salary: 4500.00 Id: 7, Name: Muffy, Age: 24, Address: Indore, Salary: 10000.00 Customer with age 25 deleted successfully...! Customer with age 2000 deleted successfully...! Table records before rollback: Id: 5, Name: Hardik, Age: 27, Address: Bhopal, Salary: 8500.00 Id: 6, Name: Komal, Age: 22, Address: MP, Salary: 4500.00 Id: 7, Name: Muffy, Age: 24, Address: Indore, Salary: 10000.00 Transaction rollbacked successfully...! Table records after rollback: Id: 1, Name: Ramesh, Age: 32, Address: Ahmedabad, Salary: 2000.00 Id: 2, Name: Khilan, Age: 25, Address: Delhi, Salary: 1500.00 Id: 3, Name: kaushik, Age: 23, Address: Kota, Salary: 2000.00 Id: 4, Name: Chaitali, Age: 25, Address: Mumbai, Salary: 6500.00 Id: 5, Name: Hardik, Age: 27, Address: Bhopal, Salary: 8500.00 Id: 6, Name: Komal, Age: 22, Address: MP, Salary: 4500.00 Id: 7, Name: Muffy, Age: 24, Address: Indore, Salary: 10000.00
import mysql.connector # Establishing the connection connection = mysql.connector.connect( host='localhost', user='root', password='password', database='tut' ) # Creating a cursor object cursorObj = connection.cursor() # Start the transaction connection.start_transaction() # Displaying the table before deleting select_query = "SELECT * FROM customers" cursorObj.execute(select_query) print("Table Data after starting Transaction:") for row in cursorObj.fetchall(): print(row) # Execute the DELETE statement delete_query = "DELETE FROM customers WHERE AGE = 25" cursorObj.execute(delete_query) print("Rows with AGE = 25 are deleted.") # Commit the transaction connection.commit() print("Transaction committed successfully.") # Displaying the table after deleting (changes are permanent) cursorObj.execute(select_query) print("Table Data After Transaction:") for row in cursorObj.fetchall(): print(row) # Now, let us delete more records delete_query1 = "DELETE FROM customers WHERE SALARY = 2000" cursorObj.execute(delete_query1) print("Rows with SALARY = 2000 are deleted.") # Display the table after the second delete operation (changes are not committed yet) cursorObj.execute(select_query) print("Table Data After Second Delete (Before Rollback):") for row in cursorObj.fetchall(): print(row) # Rollback the transaction connection.rollback() print("Transaction rollbacked successfully.") # Displaying the table after rollback (changes are reverted) cursorObj.execute(select_query) print("Table Data After Rollback:") for row in cursorObj.fetchall(): print(row) # Closing the cursor and connection cursorObj.close() connection.close()
輸出
獲得的輸出如下所示:
Table Data after starting Transaction: (1, 'Ramesh', 32, 'Ahmedabad', Decimal('2000.00')) (2, 'Khilan', 25, 'Delhi', Decimal('1500.00')) (3, 'kaushik', 23, 'Kota', Decimal('2000.00')) (4, 'Chaitali', 25, 'Mumbai', Decimal('6500.00')) (5, 'Hardik', 27, 'Bhopal', Decimal('8500.00')) (6, 'Komal', 22, 'MP', Decimal('4500.00')) (7, 'Muffy', 24, 'Indore', Decimal('10000.00')) Rows with AGE = 25 are deleted. Transaction committed successfully. Table Data After Transaction: (1, 'Ramesh', 32, 'Ahmedabad', Decimal('2000.00')) (3, 'kaushik', 23, 'Kota', Decimal('2000.00')) (5, 'Hardik', 27, 'Bhopal', Decimal('8500.00')) (6, 'Komal', 22, 'MP', Decimal('4500.00')) (7, 'Muffy', 24, 'Indore', Decimal('10000.00')) Rows with SALARY = 2000 are deleted. Table Data After Second Delete (Before Rollback): (5, 'Hardik', 27, 'Bhopal', Decimal('8500.00')) (6, 'Komal', 22, 'MP', Decimal('4500.00')) (7, 'Muffy', 24, 'Indore', Decimal('10000.00')) Transaction rollbacked successfully. Table Data After Rollback: (1, 'Ramesh', 32, 'Ahmedabad', Decimal('2000.00')) (3, 'kaushik', 23, 'Kota', Decimal('2000.00')) (5, 'Hardik', 27, 'Bhopal', Decimal('8500.00')) (6, 'Komal', 22, 'MP', Decimal('4500.00')) (7, 'Muffy', 24, 'Indore', Decimal('10000.00'))