MySQL - 事务



MySQL 事务

MySQL 事务是一组按顺序执行的数据库操作,这些操作被视为一个单一的工作单元。换句话说,除非组中的每个操作都成功,否则事务永远不会完成。如果事务中的任何操作失败,整个事务都将失败。

实际上,您可以将许多SQL查询组合成一个组,并将它们作为一个事务的一部分一起执行。这将确保不会丢失数据或SQL查询执行失败。

事务的特性

事务有四个标准特性,通常用首字母缩写词ACID表示:

  • 原子性 - 这确保事务中的所有操作都被视为一个单元。事务中的所有操作要么全部成功完成,要么全部不完成。如果事务的任何部分失败,则整个事务将回滚,数据库将保持其原始状态。

  • 一致性 - 这确保数据库在成功提交事务后会正确更改状态。

  • 隔离性 - 这使事务能够独立运行,并且彼此透明。

  • 持久性 - 这确保一旦事务提交,其对数据库的影响是永久性的,并且能够经受系统故障(例如,电源中断、硬件故障)。

Learn MySQL in-depth with real-world projects through our MySQL certification course. Enroll and become a certified expert to boost your career.

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://127.0.0.1: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'))
广告