137 MySQL事務

1、事務的概念

  • 事務:一般就是一些業務須要多條sql語句參與,參與的sql語句會造成一個執行的總體,該總體咱們稱之爲是一個事物sql

  • 簡而言之:事務就是保護多條執行的sql語句,必須同時執行成功數據庫

    案例:轉帳就是一個事務
    從一個用戶將資金轉出,再將資金轉入到另外一個用戶
    這兩條執行語句都必需要同時執行成功,或者同時不成功
    不能我已經從個人的帳戶轉給對方錢,個人錢少了可是對方沒有收到

2、事物的四大特性

  1. 原子性:事務是一組不可分割的單位,要麼同時成功,要麼同時不成功
  2. 一致性:事物先後的數據完整性應該保持一致(數據庫的完整性:若是數據庫在某一時間點下,全部的數據都符合全部的約束,則稱數據庫爲完整性的狀態)
  3. 隔離性:事物的隔離性是指多個用戶併發訪問數據時,一個用戶的事物不能被其它用戶的事務所幹擾,多個併發事務之間數據要相互隔離
  4. 持久性:持久性是指一個事物一旦被提交,它對數據的改變就是永久性的,接下來即便數據庫發生故障也不該該對其有任何影響

3、事務案例

咱們這裏就以銀行的案列爲例併發

1.先建立銀行表,而後插入兩個用戶
create table bank(
    id int,
    name varchar(16),
    money decimal(65, 2)
);
insert into bank values(1, 'Tom', 10), (2, "Bob", 10);

3.1 錯誤案例(未使用事務)

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 |
+------+------+-------+

3.2 開啓事務

開啓事務的方式code

begin;事務

sql語句;ci

sql語句;cmd

commit; 當確認上面兩條sql語句都正確執行了,同時成功了,提交事務,數據表裏的數據會進行對應的修改it

  • rollback的狀況
# 將兩條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 |
+------+------+-------+
  • commit的狀況
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 |
+------+------+-------+
相關文章
相關標籤/搜索