--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;真實提交