MySQL - 事務



MySQL 事務

MySQL 事務是一組按順序執行的資料庫操作,這些操作被視為一個單一的工作單元。換句話說,除非組中的每個操作都成功,否則事務永遠不會完成。如果事務中的任何操作失敗,整個事務都將失敗。

實際上,您可以將許多SQL查詢組合成一個組,並將它們作為一個事務的一部分一起執行。這將確保不會丟失資料或SQL查詢執行失敗。

事務的特性

事務有四個標準特性,通常用首字母縮寫詞ACID表示:

  • 原子性 - 這確保事務中的所有操作都被視為一個單元。事務中的所有操作要麼全部成功完成,要麼全部不完成。如果事務的任何部分失敗,則整個事務將回滾,資料庫將保持其原始狀態。

  • 一致性 - 這確保資料庫在成功提交事務後會正確更改狀態。

  • 隔離性 - 這使事務能夠獨立執行,並且彼此透明。

  • 永續性 - 這確保一旦事務提交,其對資料庫的影響是永久性的,並且能夠經受系統故障(例如,電源中斷、硬體故障)。

MySQL 中的事務語句

在MySQL中,事務以START TRANSACTIONBEGINBEGIN WORK語句開始,並以COMMITROLLBACK語句結束。在開始和結束語句之間執行的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'))
廣告