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