1. 程式人生 > >MySQLdb Python模組autocommit屬性測試及測試過程中關於資料庫連線的理解

MySQLdb Python模組autocommit屬性測試及測試過程中關於資料庫連線的理解

MySQLdb事務自動提交功能驗證,伺服器為MySQL5.0.77。更加要注意的是:資料庫中表型別必須是InnoDB,因為這種型別才支援事務!!!

1.設定自動提交為True,包含多條sql語句
全部執行?檢視資料庫內容驗證
sql = "select * from zhang;insert into zhang values(50);insert into zhan values(20);insert into zhang values(30)"
cursor.execute(sql)
sql = "insert into zhang values(100)"
cursor.execute(sql)

sql = "select * from zhang"
cursor.execute(sql)
row = cursor.fetchone()
while row:
 print str(row[0])
 row = cursor.fetchone()
如果從這裡和伺服器端查詢結果都是50、20、30說明是全部執行的
結果:在伺服器端查詢結果是50、20、30說明都執行了,但是在程式中這樣執行報錯,說明是API不能這麼使用的問題,但是在伺服器端的確

成功了
sql = "insert into zhang values(10)"
cursor.execute(sql)
sql = "insert into zhang values(15)"
cursor.execute(sql)
sql = "select * from zhang"
cursor.execute(sql)
row = cursor.fetchone()
while row:
 print str(row[0])
 row = cursor.fetchone()
sql = "insert into zhang values(20)"
cursor.execute(sql)
sql = "select * from zhang"
cursor.execute(sql)
row = cursor.fetchone()
while row:
 print str(row[0])
 row = cursor.fetchone()
sql = "insert into zhang values(30)"
cursor.execute(sql)
sql = "select * from zhang"
cursor.execute(sql)
row = cursor.fetchone()
while row:
 print str(row[0])
 row = cursor.fetchone()
這樣就完全沒有任何問題
注意:執行sql語句的時候,儘管把把所有sql語句寫到一個execute函式和分別把sql寫到多個execute中在伺服器端效果是相同的,但是如

果這樣,在這個資料庫連線中接下來就無法繼續執行sql語句了(注意在另一個數據庫連線中還是可以繼續執行sql語句的,應該就是各個數

據庫連線之間的資料庫操作時相互獨立的,並且具有各自獨立的執行快取,這個在進行手動提交事務設定的時候才會明顯的感受到),一旦

執行就會報Command out of sync,所以這個時候不要在一個execute中使用多條sql語句,每個execute中只能寫一條sql語句!!!

2.設定autocommit為False
也會出現以上相同的情形(不可在同一個execute中寫多條sql語句),不同的就是如果對資料進行了更新操作但是沒有進行commit的話,使

用程式碼查詢和在伺服器端查詢的結果可能是不一樣的(使用資料庫客戶端管理工具,重新建立一個數據庫連線進行查詢的結果是相同的,應

該是為每個連線設定了一個快取),這個是正常的和事務的兩階段提交機制相符,沒有提交的時候沒有真正寫入資料庫,在伺服器端查詢出

的結果實際上是另一個數據庫連線進行查詢的結果,每個連線都是在自己的快取模組中進行查詢。所以對更新功能的sql語句,在同一個資料

庫連線中,進行資料庫更新之後在進行查詢之前一定要進行commit操作(也就是說在同一個資料庫連線中,如果開啟了事務手動提交,如果

想得到真實的結果,必須對在這個查詢之前的更新操作進行提交或者回滾),否則就會造成查詢出的結果不準確、查詢出的結果並不是資料

庫中實儲存的結果的髒讀的問題。
但是這個髒讀得結果也是很有用的,可以用來進行事務二階段提交中第一階段提交的結果是否正確的驗證!!!

綜上所述:我們在做實際的資料庫管理系統的時候,每當與資料庫互動的時候都是單獨地建立一個數據庫連線---執行sql操作---得到結

果---關閉這個連線,一般查詢就是查詢,更新就是更新,沒有出現過更新---查詢---更新的操作,並且都是單執行緒的進行執行,所以當時無

法完全體會到資料庫多個不同連線之間和同一個數據庫連線中進行sql操作細微但是關鍵的不同之處。經過上述實驗可以看到,各個資料庫連

接直接的sql操作時相互獨立的,同一個資料庫連線中的sql操作是相關的,特別是設定為手動提交事務的時候可以深刻體會到這一點。