【mysql】MySQLdb中的事務處理

MySQL數據庫有一個自動提交事務的概念,autocommit。含義是,若是開啓autocommit, 則每個語句執行後會自動提交。即一個語句視爲一個事務。python

在python使用的MySQLdb中,默認是不開啓autocommit的。因此,只有在顯示commit後,數據庫操做纔會真正提交。或者在rollback()後,回滾到上一次commit的狀態。mysql

 

例:sql

#!/bin/env python
#coding=utf-8

import MySQLdb

class MYSQL(object):
    def __init__(self):
        self.db = MySQLdb.connect("localhost","root","12345678","TESTTABLE",charset='utf8')
        self.cursor = self.db.cursor()
        
    def test(self):
        try:
            sql = "insert into test_distinct(name, type) values('t3','1')"
            self.cursor.execute(sql)
            sql = "update test_distinct set type='2' where name='t3'"
            #raise   #打開用於測試異常
            self.cursor.execute(sql)
        except:
            self.db.rollback()   #出現異常,不會提交任何數據變化
        else:
            self.db.commit()   #正常處理,提交數據變化(若是沒有這一句,也是不會提交任何變化的)
            
if __name__ == "__main__":
    obj = MYSQL()
    obj.test()

 

場景:在兩次插入語句直接有一個查詢語句數據庫

#!/bin/env python
#coding=utf-8

import MySQLdb

class MYSQL(object):
    def __init__(self):
        self.db = MySQLdb.connect("localhost","root","12345678","TESTTABLE",charset='utf8')
        self.cursor = self.db.cursor()
        
    def test(self):
        try:
            name = 't5'
            #insert
            sql = "insert into test_distinct(name, type) values('%s','1')" % name
            self.cursor.execute(sql)
            #search
            sql = "select * from test_distinct where name = '%s'" % name   #查詢新插入的數據
            self.cursor.execute(sql)
            res = self.cursor.fetchone()
            print res
            #insert
            sql = "update test_distinct set type='2' where name='%s'" % name
            raise   #引發異常
            self.cursor.execute(sql)
        except:
            self.db.rollback()
        else:
            self.db.commit()
            
if __name__ == "__main__":
    obj = MYSQL()
    obj.test()

結果:測試

能夠正確查詢到新插入的數據,而且數據成功回滾,沒有寫入數據。fetch

結論:雖然沒有commit時,數據庫不會真正變化,可是會有一個臨時變化的版本,供咱們查詢還未真正加入的數據。spa

 

注意:上面的結果是創建在mysql使用的存儲引擎支持事務的基礎上的。若是用MyISAM,則即便像上面同樣寫代碼,也會默認一句話就提交一次的,由於MyISAM不支持事務。code

相關文章
相關標籤/搜索