MySQL學習-MySQL內置功能_事務操做

1.事務詳解

1.1 事務的概念

  MySQL 事務主要用於處理操做量大,複雜度高的數據。好比說,在人員管理系統中,你刪除一我的員,你即須要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操做語句就構成一個事務!mysql

  • 在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。
  • 事務處理能夠用來維護數據庫的完整性,保證成批的 SQL 語句要麼所有執行,要麼所有不執行。
  • 事務用來管理 insert,update,delete 語句

1.2 事務的特性

通常來講,事務是必須知足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。sql

  • 原子性:一個事務(transaction)中的全部操做,要麼所有完成,要麼所有不完成,不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。數據庫

  • 一致性:在事務開始以前和事務結束之後,數據庫的完整性沒有被破壞。這表示寫入的資料必須徹底符合全部的預設規則,這包含資料的精確度、串聯性以及後續數據庫能夠自發性地完成預約的工做。併發

  • 隔離性:數據庫容許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性能夠防止多個事務併發執行時因爲交叉執行而致使數據的不一致。事務隔離分爲不一樣級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。ide

  • 持久性:事務處理結束後,對數據的修改就是永久的,即使系統故障也不會丟失。spa

1.3 經常使用事務的控制語句

  • BEGIN 或 START TRANSACTION 顯式地開啓一個事務;code

  • COMMIT 也可使用 COMMIT WORK,不過兩者是等價的。COMMIT 會提交事務,並使已對數據庫進行的全部修改爲爲永久性的;blog

  • ROLLBACK 也可使用 ROLLBACK WORK,不過兩者是等價的。回滾會結束用戶的事務,並撤銷正在進行的全部未提交的修改;事務

  • SAVEPOINT identifier,SAVEPOINT 容許在事務中建立一個保存點,一個事務中能夠有多個 SAVEPOINT;ip

  • RELEASE SAVEPOINT identifier 刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;

  • ROLLBACK TO identifier 把事務回滾到標記點;

  • SET TRANSACTION 用來設置事務的隔離級別。InnoDB 存儲引擎提供事務的隔離級別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

1.4 mysql事務處理方法

一、用 BEGIN, ROLLBACK, COMMIT來實現

  • BEGIN 開始一個事務
  • ROLLBACK 事務回滾
  • COMMIT 事務確認

二、直接用 SET 來改變 MySQL 的自動提交模式:

  • SET AUTOCOMMIT=0 禁止自動提交
  • SET AUTOCOMMIT=1 開啓自動提交

2.實際例子

  可是在平常生活中,好比張三有15620元錢(在支付寶上面),李四有240元,如今張三要給李四轉600元。這時候咱們須要數據庫中,在張三的15620上減掉600,在李四的240上面加上600。這是倆個mysql的語句,可是若是咱們執行的時候,在減掉張三的語句成功執行以後,第二句語句執行失敗(由於某一種緣由)。那是否是這600塊就憑空消失了呢?很明顯,支付寶不可能讓這樣的事情發生。因此咱們要把這倆個語句綁在一塊,要麼一塊兒執行成功,要麼就都執行失敗。

# -*- coding: UTF-8 -*-

import MySQLdb  

#包的導入

db = MySQLdb.connect("ip地址,本機爲localhost""用戶名","密碼","表名")

#打開數據庫的鏈接 

cursor = db.cursor()

#使用cursor()方法得到操做遊標

try:
   # 執行sql語句
   cursor.execute("update account set money=money-600 where name='zhangsan'")
   cursor.execute("update account set money=money+600 where name='lisi'")
   # 提交到數據庫執行
   db.commit()
except:
   # 發生錯誤時回滾    回滾到獲取遊標的位置開始從新執行  看代碼上面的文字有說明
   db.rollback()

db.close()

#關閉數據庫的鏈接

OK

相關文章
相關標籤/搜索