1. 程式人生 > 實用技巧 >事務,儲存過程

事務,儲存過程

一、事務

1、什麼是事務:

資料庫事務是指作為單個邏輯工作單元執行的一系列操作(SQL語句)。這些操作要麼全部執行,要麼全部不執行。

2、為什麼要有事務:

經典的銀行轉賬,多條sql語句一起執行,要麼一起成功,要麼一起失敗,單一執行,萬一失敗不就一方損失了嗎?

3、事務特性(4種):

  1. 原子性 (atomicity):強調事務的不可分割.
  2. 一致性 (consistency):事務的執行的前後資料的完整性保持一致.
  3. 隔離性 (isolation):一個事務執行的過程中,不應該受到其他事務的干擾
  4. 永續性(durability) :事務一旦結束,資料就持久到資料庫

4、事務執行模式(3種)

  1. 自動提交事務:預設事務管理模式。如果一個語句成功地完成,則提交該語句;如果遇到錯誤,則回滾該語句。
  2. 顯式事務:以BEGIN TRANSACTION顯式開始,以COMMIT或ROLLBACK顯式結束。
  3. 隱性事務:當連線以此模式進行操作時,sql將在提交或回滾當前事務後自動啟動新事務。無須描述事務的開始,只需提交或回滾每個事務。它生成連續的事務鏈。

例:

 1 create table user(
 2 id int primary key auto_increment,
 3 name char(32),
 4 balance int
 5 );
 6 
 7 insert into user(name,balance)
 8 values
 9 ('老李',999),
10 ('老張',999),
11 ('老朱',999); 12 13 #原子操作 14 start transaction; 15 update user set balance=899 where name='wsb'; #買支付100元 16 update user set balance=1009 where name='egon'; #中介拿走10元 17 update user set balance=1089 where name='ysb'; #賣家拿到90元 18 commit; 19 20 #出現異常,回滾到初始狀態 21 start transaction; 22 update user set balance=899 where name='
wsb'; #買支付100元 23 update user set balance=1009 where name='egon'; #中介拿走10元 24 uppdate user set balance=1089 where name='ysb'; #賣家拿到90元,出現異常沒有拿到 25 rollback; 26 commit; 27 mysql> select * from user; 28 +----+------+---------+ 29 | id | name | balance | 30 +----+------+---------+ 31 | 1 | wsb | 999 | 32 | 2 | egon | 999 | 33 | 3 | ysb | 999| 34 +----+------+---------+ 35 3 rows in set (0.00 sec)

在pymysql中:

 1 try:
 2     cursor.execute(sql_1)  
 3     cursor.execute(sql_2)  
 4     cursor.execute(sql_3)  
 5 except Exception as e:
 6     connect.rollback()  # 事務回滾
 7     print('事務處理失敗', e)
 8 else:
 9     connect.commit()  # 事務提交
10     print('事務處理成功', cursor.rowcount)# 關閉連線
11 cursor.close()
12 connect.close()

總結:事務用於將某些操作的多個SQL作為原子性操作,一旦有某一個出現錯誤,即可回滾到原來的狀態,從而保證資料庫資料完整性。

二、儲存過程

1、 介紹

儲存過程包含了一系列可執行的sql語句,儲存過程存放於MySQL中,通過呼叫它的名字可以執行其內部的一堆sql

使用儲存過程的優點:

#1. 用於替代程式寫的SQL語句,實現程式與sql解耦

#2. 基於網路傳輸,傳別名的資料量小,而直接傳sql資料量大

使用儲存過程的缺點:
#1. 程式設計師擴充套件功能不方便