標籤:增加 隔離 let 需要 exception except 用法 any 使用者
一、MySQL 事務
事務就是指邏輯上的一組 SQL 操作,組成這組操作的各個 SQL 陳述式,執行時要麼全成功要麼全失敗。
舉個例子,小明給小紅轉賬100元,轉賬過程實際上就是小明的賬戶減少100元,小紅的賬戶增加100元,對應的SQL語句為:
update account set money=money-5 where name=‘xiaoming‘;
update account set money=money+5 where name=‘xiaohong‘;
上述的兩條SQL操作,在事務中的操作就是要麼都執行成功,要麼都執行失敗,如果只有第一條成功,那麼小明就損失100元,而小紅並沒有收到100元,這是不可取的,所以這就是事務,事務就是指邏輯上的一組 SQL 操作,組成這組操作的各個 SQL 陳述式,執行時要麼全成功要麼全失敗。交易處理可以用來維護資料庫的完整性,保證成批的 SQL 陳述式要麼全部執行,要麼全部不執行,在 MySQL 中只有使用了 Innodb 庫引擎的資料庫或表才支援事務,所以很多情況下我們都使用 Innodb 引擎.
事務的特性如下:
原子性:事務是一個不可分割的單位,事務中的所有 SQL 操作要麼都成功,要麼都失敗
一致性:事務發生前和發生後,資料的完整性必須保持一致
隔離性:當並發訪問資料庫時,一個正在執行的事務在執行完畢前,對於其它的會話是不可見的,多個並發事務之間的資料是相互隔離的
持久性:一個事務一旦被提交,它對資料庫中的資料改變就是永久性的,如果出了錯誤,事務也不允許撤銷,只能通過 "補償性事務"
mysql> begin # 開啟事務mysql> rollback # 復原事務mysql> commit # 提交事務
資料庫預設事務是自動認可的,也就是說,當我們執行 select,insert,update,delete 等操作時,就會自動認可事務,如果關閉事務的自動認可,那麼我們執行完 select,insert,update,delete 操作後需要再執行 commit 來提交事務,否則就不會執行
二、遊標
遊標是系統為使用者開設的一個資料緩衝區,存放 SQL 陳述式的執行結果,用法如下:
In [1]: import MySQLdbIn [2]: c = MySQLdb.connect(user=‘root‘, passwd=‘pzk123‘, db=‘mysql‘) # 串連資料庫In [3]: cus = c.cursor() # 建立一個遊標對象In [4]: cus.execute(‘select * from user;‘) # 使用execute()方法可以執行SQL語句,執行後的結果會存在緩衝區Out[4]: 4LIn [5]: result1 = cus.fetchone() # 可以使用fetchone()來查看緩衝區的一條記錄In [6]: result2 = cus.fetchmany(3) # 可以使用fetchmany()來查看緩衝區的多條記錄 In [7]: result3 = cus.fetchall() # 可以使用fetchall()來查看所有的記錄
三、根據遊標執行 MySQL 事務
#!/usr/bin/env pythonimport MySQLdbdef connect_mysql(): db_config = { ‘host‘: ‘127.0.0.1‘, ‘port‘: 3306, ‘user‘: ‘root‘, ‘passwd‘: ‘pzk123‘ } c = MySQLdb.connect(**db_config) return cif __name__ == ‘__main__‘: c = connect_mysql() # 首先串連資料庫 cus = c.cursor() # 產生遊標對象 sql = ‘drop database test;‘ # 定義要執行的SQL語句 try: cus.execute(sql) # 執行SQL語句 c.commit() # 如果執行成功就提交事務 except Exception as e: c.rollback() # 如果執行失敗就復原事務 raise e finally: c.close() # 最後記得關閉資料庫連接
Python 執行 MySQL 事務