事务(transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
基于事务的原子性、一致性、隔离性和持续性特征,可以将相关的数据操作定义到一个事务当中。
如果操作过程中没有发生异常情况,就提交事务(commit)
如果发生了异常,就可以利用事务回滚(rollback),将数据库恢复到事务开启之前的状态。
下面,通过一个小案例,演示事务的提交和回滚(重点在于回滚)。
开启事务: begin; 提交事务:commit; 回滚:rollback;
操作示例:
mysql> #开启事务
-> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from student;
+----+------+-----+
| Id | Name | Age |
+----+------+-----+
| 1 | 李华 | 23 |
| 2 | 李强 | 22 |
| 3 | 刘明 | 26 |
| 4 | 杰克 | 21 |
+----+------+-----+
4 rows in set (0.06 sec)
mysql> #插入操作
-> insert into student values(5,'Jimmy',20);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+----+-------+-----+
| Id | Name | Age |
+----+-------+-----+
| 1 | 李华 | 23 |
| 2 | 李强 | 22 |
| 3 | 刘明 | 26 |
| 4 | 杰克 | 21 |
| 5 | Jimmy | 20 |
+----+-------+-----+
5 rows in set (0.06 sec)
mysql> #回滚操作
-> rollback;
Query OK, 0 rows affected (0.05 sec)
mysql> select * from student;
+----+------+-----+
| Id | Name | Age |
+----+------+-----+
| 1 | 李华 | 23 |
| 2 | 李强 | 22 |
| 3 | 刘明 | 26 |
| 4 | 杰克 | 21 |
+----+------+-----+
4 rows in set (0.06 sec)
mysql> insert into student values(5,'Jimmy',20);
Query OK, 1 row affected (0.08 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from student;
+----+-------+-----+
| Id | Name | Age |
+----+-------+-----+
| 1 | 李华 | 23 |
| 2 | 李强 | 22 |
| 3 | 刘明 | 26 |
| 4 | 杰克 | 21 |
| 5 | Jimmy | 20 |
+----+-------+-----+
5 rows in set (0.06 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from student;
+----+-------+-----+
| Id | Name | Age |
+----+-------+-----+
| 1 | 李华 | 23 |
| 2 | 李强 | 22 |
| 3 | 刘明 | 26 |
| 4 | 杰克 | 21 |
| 5 | Jimmy | 20 |
+----+-------+-----+
5 rows in set (0.05 sec)
从上面的操作可以看到,开启事务之后对数据库进行操作,操作时候随即进行查看,可以看到记录是被修改的状态。但是随着事务回滚操作的进行,数据被退回到事务开始之前的状态。但是提交之后,回滚就不起作用了。
不论是上一次演示的事务提交被修改还是上面演示的回滚之后数据操作被回退,都是事务的正常应用。当事务被开启之后,对数据库所进行的操作都回被缓存起来,当提交事务的时候才会真正操作并写入到数据库中,如果选择的不是提交而是回滚,就不会将事务中定义的操作运用到数据库中。
数据库事务应用
程序设计中,如果不确定对数据库的操作一定回成功,比如完成某一功能需要进行多次数据库操作,如果前面的操作都成功了,但是后面的某一步操作因为某些原因失败,就需要进行重新操作,这个时候,我们希望数据库是操作之前的状态,事务就可以帮我们完成这样的设计。在这一组操作之前,开启一个事务,每进行一个操作都对操作进行验证,确保操作被有效进行,如果所有操作都正确执行,就提交事务,如果有哪步操作发生了异常,就进行事务回滚。