目錄mysql
事務:一般就是一些業務須要多條sql語句參與,參與的sql語句會造成一個執行的總體,該總體咱們稱之爲是一個事物sql
簡而言之:事務就是保護多條執行的sql語句,必須同時執行成功數據庫
案例:轉帳就是一個事務 從一個用戶將資金轉出,再將資金轉入到另外一個用戶 這兩條執行語句都必需要同時執行成功,或者同時不成功 不能我已經從個人的帳戶轉給對方錢,個人錢少了可是對方沒有收到
咱們這裏就以銀行的案列爲例併發
1.先建立銀行表,而後插入兩個用戶 create table bank( id int, name varchar(16), money decimal(65, 2) ); insert into bank values(1, 'Tom', 10), (2, "Bob", 10);
1.進行轉帳操做(沒有事務的支持下) # 先將Tom的錢減去,而後再給ruakei的用戶加錢,但問題來了 # 咱們的表裏面並無ruakey這個用戶啊,因此給ruakey加錢的這個sql語句其實是沒有意義的 # 因此這樣就會致使Tom用戶的錢就丟了,因此吳國一個銀行出現了這種狀況的話,後果不堪設想 update bank set money=money-1 where name='Tom'; update bank set money=money+1 where name='ruakei'; mysql> select * from bank; +------+------+-------+ | id | name | money | +------+------+-------+ | 1 | Tom | 9.00 | | 2 | Bob | 10.00 | +------+------+-------+
開啓事務的方式code
begin;事務
sql語句;ci
sql語句;cmd
commit; 當確認上面兩條sql語句都正確執行了,同時成功了,提交事務,數據表裏的數據會進行對應的修改it
# 將兩條sql看作事務處理 # 開啓事務 begin; update bank set money=money-1 where name='Tom'; update bank set money=money+1 where name='ruakei'; select * from bank;(這個時候,發現表裏的數據tom被減錢了,沒有ruakey這個帳戶,因此以上兩條sql語句是錯誤的因此,執行rollback語句還原tom用戶減錢以前) # 確認有誤,回滾 rollback; ##################################cmd 圖解 mysql> select * from bank; +------+------+-------+ | id | name | money | +------+------+-------+ | 1 | Tom | 9.00 | | 2 | Bob | 10.00 | +------+------+-------+ mysql> rollback; Query OK, 0 rows affected (0.14 sec) mysql> select * from bank; +------+------+-------+ | id | name | money | +------+------+-------+ | 1 | Tom | 10.00 | | 2 | Bob | 10.00 | +------+------+-------+
begin; update bank set money=money-1 where name='Tom'; update bank set money=money+1 where name='Bob'; select * from bank;(這個時候,發現表裏的數據tom被減錢了,bob帳戶也加錢了,因此咱們提交事務) # 確認無誤,提交事務 commit; ######################################cmd 圖解 mysql> select * from bank; +------+------+-------+ | id | name | money | +------+------+-------+ | 1 | Tom | 9.00 | | 2 | Bob | 11.00 | +------+------+-------+