版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38234015/article/details/89488034
概述
事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
基于事务的原子性、一致性、隔离性和持续性特征,可以将相关的数据操作定义到一个事务当中。如果操作过程中没有发生异常情况,就提交事务,如果发生了异常,就可以利用事务回滚,将数据库恢复到事务开启之前的状态。
下面,通过一个小案例,演示事务的提交和回滚(重点在于回滚)。
开启事务: begin; 提交事务:commit; 回滚:rollback;
进入数据库,选择一个数据库并查看一个已经存在的表的记录
Microsoft Windows [版本 10.0.17134.706]
(c) 2018 Microsoft Corporation。保留所有权利。
C:\Windows\system32>mysql -hlocalhost -uroot -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1546
Server version: 8.0.12 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> select * from student;
+-----+--------+------+------+--------------------------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----+--------+------+------+--------------------------+
| 001 | 张华 | 男 | 23 | 软件工程专业
| 002 | 李华 | 男 | 18 | 大数据科学与技术
| 003 | 耿耿 | 女 | 18 | 数字媒体与艺术
| 004 | 余淮 | 男 | 18 | 大数据科学与技术
+-----+--------+------+------+--------------------------+
4 rows in set (0.00 sec)
现在,开启事务并对数据进行操作
mysql> # 开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> # 在进行操作之前,再一次查看数据记录
mysql> select * from student;
+-----+--------+------+------+--------------------------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----+--------+------+------+--------------------------+
| 001 | 张华 | 男 | 23 | 软件工程专业
| 002 | 李华 | 男 | 18 | 大数据科学与技术
| 003 | 耿耿 | 女 | 18 | 数字媒体与艺术
| 004 | 余淮 | 男 | 18 | 大数据科学与技术
+-----+--------+------+------+--------------------------+
4 rows in set (0.00 sec)
mysql> # 现在修改student表中的一条数据
mysql> update student set Sname = '阿正' where Sno = '001';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> # 再次查看数据记录
mysql> select * from student;
+-----+--------+------+------+--------------------------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----+--------+------+------+--------------------------+
| 001 | 阿正 | 男 | 23 | 软件工程专业
| 002 | 李华 | 男 | 18 | 大数据科学与技术
| 003 | 耿耿 | 女 | 18 | 数字媒体与艺术
| 004 | 余淮 | 男 | 18 | 大数据科学与技术
+-----+--------+------+------+--------------------------+
4 rows in set (0.00 sec)
mysql> # 现在提交事务
mysql> commit;
Query OK, 0 rows affected (0.23 sec)
mysql> # 事务提交之后,再次查看数据记录,数据被修改
mysql> select * from student;
+-----+--------+------+------+--------------------------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----+--------+------+------+--------------------------+
| 001 | 阿正 | 男 | 23 | 软件工程专业
| 002 | 李华 | 男 | 18 | 大数据科学与技术
| 003 | 耿耿 | 女 | 18 | 数字媒体与艺术
| 004 | 余淮 | 男 | 18 | 大数据科学与技术
+-----+--------+------+------+--------------------------+
4 rows in set (0.00 sec)
上面是正常提交事务的一个流程,下面,我们使用回滚操作,看一下回滚会发生什么,然后再对这个过程进行解释。
mysql> # 开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> # 查看数据记录
mysql> select * from student;
+-----+--------+------+------+--------------------------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----+--------+------+------+--------------------------+
| 001 | 阿正 | 男 | 23 | 软件工程专业
| 002 | 李华 | 男 | 18 | 大数据科学与技术
| 003 | 耿耿 | 女 | 18 | 数字媒体与艺术
| 004 | 余淮 | 男 | 18 | 大数据科学与技术
+-----+--------+------+------+--------------------------+
4 rows in set (0.00 sec)
mysql> # 修改数据
mysql> update student set Sname = '阿华' where Sno = '002';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> # 再次查看数据记录
mysql> select * from student;
+-----+--------+------+------+--------------------------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----+--------+------+------+--------------------------+
| 001 | 阿正 | 男 | 23 | 软件工程专业
| 002 | 阿华 | 男 | 18 | 大数据科学与技术
| 003 | 耿耿 | 女 | 18 | 数字媒体与艺术
| 004 | 余淮 | 男 | 18 | 大数据科学与技术
+-----+--------+------+------+--------------------------+
4 rows in set (0.00 sec)
mysql> # 经过查询,可以看到002的Sname属性已经被修改了
mysql> # 进行数据回滚操作
mysql> rollback;
Query OK, 0 rows affected (0.02 sec)
mysql> # 再次查看数据记录,发现被修改的数据又被恢复了原本的状态
mysql> select * from student;
+-----+--------+------+------+--------------------------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----+--------+------+------+--------------------------+
| 001 | 阿正 | 男 | 23 | 软件工程专业
| 002 | 李华 | 男 | 18 | 大数据科学与技术
| 003 | 耿耿 | 女 | 18 | 数字媒体与艺术
| 004 | 余淮 | 男 | 18 | 大数据科学与技术
+-----+--------+------+------+--------------------------+
4 rows in set (0.00 sec)
从上面的操作可以看到,开启事务之后对数据库进行操作,操作时候随即进行查看,可以看到记录是被修改的状态。但是随着事务回滚操作的进行,数据被退回到事务开始之前的状态。
不论是上一次演示的事务提交被修改还是上面演示的回滚之后数据操作被回退,都是事务的正常应用。当事务被开启之后,对数据库所进行的操作都回被缓存起来,当提交事务的时候才会真正操作并写入到数据库中,如果选择的不是提交而是回滚,就不会将事务中定义的操作运用到数据库中。
数据库事务应用
程序设计中,如果不确定对数据库的操作一定回成功,比如完成某一功能需要进行多次数据库操作,如果前面的操作都成功了,但是后面的某一步操作因为某些原因失败,就需要进行重新操作,这个时候,我们希望数据库是操作之前的状态,事务就可以帮我们完成这样的设计。在这一组操作之前,开启一个事务,每进行一个操作都对操作进行验证,确保操作被有效进行,如果所有操作都正确执行,就提交事务,如果有哪步操作发生了异常,就进行事务回滚。