MySQL事务用来做什么,如何控制 commit 和rollback


--MySQL事务

MySQL中事务其实是一个最小的不可分割的工作单元。事务能够保证一个业务的完整性。

比如银行转账;

a--> -100

updata user set money=money-100 where name ='a';

b--> +100

updata 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语句中,可能有同时成功的要求,要么同时失败

 

--MySQL中如何控制事务?

1、MySQL默认是开启事务的(自动提交)。

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set

 

--默认事务开启的作用是什么?

--当我们取执行一个sql语句的时候,效果会立即体现出来,且不能回滚。

create database bank;

create table user(

  id int primary key,

  name varchar(20),

  money int

)

insert into user values(1,'a',1000);

 

--事务回滚;撤销sql语句执行效果

rollback;



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

mysql> rollback;
Query OK, 0 rows affected

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

 

--设置MySQL自动提交为0;

set autocommit=0;设置关闭了MySQL的自动提交,插入数据是虚拟表,后可用 rollback; 撤销,再使用 commit; 真实提交数。

使用commit后,是不可撤销下的(持久性)

mysql> set autocommit=0;
Query OK, 0 rows affected

mysql> insert into user values(3,'c',3000);
1062 - Duplicate entry '3' for key 'PRIMARY'
mysql> select *from user;
+--------+----------+-----------+
|   id |   name |   money |
+--------+----------+-----------+
|      1 | a        |      1000 |
|      2 | b        |      2000 |
|      3 | c        |      3000 |
+--------+----------+-----------+
3 rows in set

mysql> rollback;
Query OK, 0 rows affected

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

mysql> commit;
Query OK, 0 rows affected

mysql> insert into user values(3,'c',3000);
Database changed
mysql> commit;
Query OK, 0 rows affected

mysql> rollback;
Query OK, 0 rows affected

mysql> select *from user;
+--------+----------+-----------+
|   id |   name |   money |
+--------+----------+-----------+
|      1 | a        |      1000 |
|      2 | b        |      2000 |
|      3 | c        |      3000 |
+--------+----------+-----------+
3 rows in set

 

--自动提交?@@autocommit=1

--手动提交?commit;

--事务回滚?rollback;

如果说这个时候转账

 
 
rollback; 反悔撤回

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

将autocommit设置回去

 

mysql> select @@autocommit=1;
+----------------+
| @@autocommit=1 |
+----------------+
|              1 |
+----------------+
1 row in set mysql> 
begin;
--或者
start transaction; --都可以帮我们手动开启一个事务
--手动开启临时事务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;真实提交 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM