MySQL数据库中的事务----详解(1)

事务( transaction)是一个逻辑操作的最小单位,具体的在数据库中的是指一组操作的sql语句,这组sql在执行时要全部成功,才可以提交(commit)操作的数据,一旦有任何一条失败,则要回滚,所有sql操作均失去效果。

在MySQL中,操作的sql语句默认是自动提交的,同时还提供begin和start transaction方式来开启事务,实现手动提交(commit),只有没有提交的操作才可以回滚(rollback)。接下来就来逐一介绍它们具体的使用方法和操作需要注意的“坑”。
一.autocommit参数
autocommit决定了MySQL中是否在执行完一条数据后可以直接提交结果,在MySQL中默认的是1,即开启自动提交,当将它的值设置为0时,便不会自动提交,在执行SQL之后,就可以手动提交或者选择回滚。
(一)查看autocommit的值,进入MySQL数据库中,使用

SELECT @@autocommit;

来查看相关@autocommit的值

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

这里可以看到,值=1,也就是默认的开启自动提交的,但要实现事务,我们要关闭自动提交。
(二)设置autocommit的值来关闭自动提交。使用

 set autocommit=0;

将其值设置为0,从而关闭自动提交。

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

这样,在我们执行sql语句后,就需要手动提交,不然不会修改结果。
(三)commit和rollback的效果展示

+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| curry |   15 | 10001 |
+-------+------+-------+

这是一个user表,里面有name,age,id字段。首先给这个表中添加一个数据

mysql> insert into user values('tom',10,2);
Query OK, 1 row affected (0.01 sec)

这里我们看到已经添加成功了,但是数据真的保存了吗?select一下看看

mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| tom   |   10 |     2 |
| curry |   15 | 10001 |
+-------+------+-------+
3 rows in set (0.00 sec)

发现确实在表里了,但这里也是没有提交的,回滚一下会怎么样?

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| curry |   15 | 10001 |
+-------+------+-------+
2 rows in set (0.00 sec)

tom的信息没有了,这就是通过设置autocommit=0,从而关闭自动提交,然后通过回滚实现事务的一种方式。但这有一个问题,就是设置了这个参数后,整个数据库在提交操作的时候都需要手动提交,很麻烦。MySQL很贴心的提供了begin和start transaction方法,真正实现操作一组数据,对于报错的手动回滚!
二、begin
在要写sql语句之前,先使用

mysql> begin;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into user values('tom',10,2);
Query OK, 1 row affected (0.01 sec)
mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| tom   |   10 |     2 |
| curry |   15 | 10001 |
+-------+------+-------+
3 rows in set (0.00 sec)

插入了,那能不能使用rollback回滚那?

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| curry |   15 | 10001 |
+-------+------+-------+

成功回滚,下面的start transaction方法和这个使用步骤一样。
三、start transaction
在这里,我们就不直接回滚,我们操作完sql之后,手动提交,然后回滚看看效果!
首选使用start transaction

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

插入数据

mysql> insert into user values('tom',10,2);
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| tom   |   10 |     2 |
| curry |   15 | 10001 |
+-------+------+-------+
3 rows in set (0.00 sec)

手动提交

mysql> commit;
Query OK, 0 rows affected (0.01 sec)

然后回滚,并查看结果

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| tom   |   10 |     2 |
| curry |   15 | 10001 |
+-------+------+-------+
3 rows in set (0.00 sec)

可以看到,一旦提交,是不可以回滚的,在没有提交之前,可以通过回滚撤回操作不保留sql效果!下一节详细介绍事务的四大特性和事务的隔离级别以及会出现的问题等。
下一节:MySQL数据库中的事务特性和事务的隔离级别问题

猜你喜欢

转载自blog.csdn.net/Wangdiankun/article/details/105868933
今日推荐