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