寫個小腳本,准備全部用MySQL做數據庫,redis一直沒好好學,所以不想用。
邏輯是這樣的,我這邊查尋一個數據,如果這個數據存在就賦值屬性,如果不存在,執行任務寫入數據庫。
然后再次執行查尋數據,寫入對象屬性。
# 初始化用戶的uid,uid可以從用戶收入數據庫表中讀取 def _initialize_uid(self): # 讀寫的時候需要重新連一下數據庫,保證讀取的數據的跟新。 uid_info = self.db.selectDb(SEARCH_USER_UID, (self.account,)) # 假如不能讀出來,執行用戶的收入表跟新數據。 if uid_info: self.uid = uid_info[0][0] else: print(123)
# 寫入數據庫信息, if get_money_income(self.account)[0]: time.sleep(2)
# 重新執行該方法去讀取數據 self._initialize_uid()
假如你的數據庫一致保持着鏈接,發現我采取這種遞歸的模式更本無法讀取到寫入后數據的數據庫信息。暫時沒有什么好的辦法。
唯一的解決辦法是每次查尋的時候,可以新建一個連接對象,但這樣的話,感覺對數據庫壓力會比較大。
后續我也使用過多線程進行數據庫操作,類似生產者與消費者的關系,記得一個寫,一個讀可以讀取到數據庫跟新,難道單線程自己寫好,自己讀取寫好的數據無法完成?
這樣的話,感覺使用就會帶來非常大的麻煩。
已經找到解決方法
今天做一個監控后台數據庫數據的程序中,使用了pymysql,但是在每次使用游標對象select對象時數據都是一個樣。
原因在於:1. Mysql的存儲引擎InooDB的事務隔離級別默認是 可重復讀(Repeatable Read),例如A客戶端事務未提交,而B客戶端事務修改了數據,A客戶端只能讀取到小於等於當前事務版本號的數據(快照讀),所以只有提交完事務后,開啟新的事務中才能讀取到新的數據。
2. PyMysql模塊的連接對象默認是沒有自動提交事務的,需要我們用一個commite()方法才能提交,不像我們在MySQL客戶端中,每次select,update,delete都幫我們自動提交事務,所以只要我們手動提交了事務,再重新select就可以查到新的數據。
解決方法:
方法一: 每次在用游標對象執行完查詢語句后都手動提交
from pymysql import *
con = connect(host = ‘xxxx’, port = xxxx, database = ‘xxxx’, user = 'root', password = '123123', charset = 'utf8')
cs = con.cursor()
sql = ‘select * from xxx where id = 1’
# 開啟事務
cs.execute(sql)
# 手動關閉事務
con.commit()
print(cs.fetchone()) #數據a
# 再開啟事務
cs.execute(sql)
# 再關閉事務
con.commit()
print(cs.fetchone()) #更新后的數據
方法二.創建一個自動幫我們提交事務的連接對象
con = connect(host = 'localhost', port = 3306, database = 'smarthome', user = 'root', password = '123123', charset = 'utf8’, autocommit = 1)
這樣就不用每次查數據都手動結束事務
但是修改數據要小心,因為自動提交,沒有commit也會生效。
————————————————
版權聲明:本文為CSDN博主「JackChan7」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/JackChan7/java/article/details/88741060
主要還是對事務的特性的理解還是停留在概念上,這次問題的出現讓我對事務有了更深的認識。