SQL语句高级(十二)——MySQL事务

一、sql事务
mysql中,事务其实是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。
比如我们的银行转账:

a 转100 -100
update user set money=money-100 where name = 'a';
b 收100 +100
update user set money=money+100 where name = 'b';

——实际的程序中,如果只有一条语句执行成功了,而另外一条没有执行成功?
——出现数据前后不一致。

update user set money=money-100 where name='a';
update user set money=money+100 where name='b';

——多条sql语句,可能会有同时成功的要求,要么就同时失败。

二、如何控制事务commit_rollback
mysql中如何控制事务?
1、mysql默认开启事务的。(自动提交!)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+

默认事务开启的作用是什么?
当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚!

create database bank;
	mysql> use bank;
Database changed

mysql> create table user(
    -> id int primary key,
    -> name varchar(20),
    -> money int
    -> );
Query OK, 0 rows affected (0.62 sec)

mysql> insert into user values(1,'a',1000);
Query OK, 1 row affected (0.20 sec)

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
+----+------+-------+
1 row in set (0.00 sec)

——事务回滚:撤销sql语句执行效果!
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
+----+------+-------+
数据仍然存在,说明不能回滚!

——设置mysql自动提交为false
set autocommit=0;
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
——上面的操作,关闭了mysql的自动提交(commitinsert into user values(2,'b',1000);
mysql> insert into user values(2,'b',1000);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user;——复制了一张虚拟的表,还没有提交(commit)上去!!
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.17 sec)

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
+----+------+-------+
1 row in set (0.00 sec)

mysql> insert into user values(2,'b',1000);
Query OK, 1 row affected (0.00 sec)

mysql> commit;								——手动提交数据!提交之后就回滚不来了!!
Query OK, 0 rows affected (0.05 sec)

mysql> rollback;							——撤销不了了!!(持久性)
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

——自动提交?@@autocommit=1
——手动提交?commit;
——事务回滚?rollback;
——如果说这个时候转账;

update user set money=money-100 where name='a';
update user set money=money+100 where name='b';

rollback;
mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   900 |
|  2 | b    |  1100 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.11 sec)

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

——事务给我们提供了一个返回的机会。

三、手动开启事务:begin_start_transaction
set autocommit=1;                                ——把默认值还原回去!!!
mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+

begin; 
——或者 
start transaction; 
——都可以帮我手动开启一个事务;

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |  1000 |
|  2 | b    |  1000 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> update user set money=money-100 where name='a';
Query OK, 1 row affected (0.10 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update user set money=money+100 where name='b';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   900 |
|  2 | b    |  1100 |
+----+------+-------+
2 rows in set (0.00 sec)

mysql> rollback;                      ——但是无效!!!!
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | a    |   900 |
|  2 | b    |  1100 |
+----+------+-------+
2 rows in set (0.00 sec)
手动开启事务(1):——可回滚!
begin;
update user set money=money-100 where name='a';
update user set money=money+100 where name='b';

手动开启事务(2):——可回滚!
start transaction;
update user set money=money-100 where name='a';
update user set money=money+100 where name='b';

commit;	——提交之后就无法回滚了!!!!!!!


事务开启之后,一旦commit提交,就不可以回滚!!(也就是当前的这个事务在提交的时候就结束了!!)

猜你喜欢

转载自blog.csdn.net/qq_37150711/article/details/87407012
今日推荐