一、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的自动提交(commit )
insert 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 提交,就不可以回滚!!(也就是当前的这个事务在提交的时候就结束了!!)