在工做中真實遇到的問題:用python鏈接mysql,查詢數據,同時有別的代碼在更新mysql中的數據,前者是一直是保持鏈接的數據庫,每一分鐘select一次,但第二次卻查不到更新後的數據?why?html
mysql客戶端鏈接查詢不到最新數據的問題?python
應該是mysql的事務隔離級別的設置問題,把 mysql 的 Innodb 的默認事務隔離級別是重複讀(repeatable read)修改成 提交讀(read committed) 便可。mysql
概念:sql
例如:在關係數據庫中,一個事務能夠是一條SQL語句,一組SQL語句或整個程序。數據庫
舉例:併發
修改表中的數據,首先是刪除原有記錄,而後再插入,有2步,可是若是插入失敗的話會致使數據丟失。性能
用事務的概念來處理:刪除和插入是一件事情,只有2步都成功,數據才發生改變。否者,恢復到原來的數據。spa
1.Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。.net
2.Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。【在一個事務中,對於同一份數據的讀取結果老是相同的,不管是否有其餘事務對這份數據進行操做,以及這個事務是否提交】htm
3.Read committed (讀已提交):可避免髒讀的發生。【只有在事務提交後,其更新結果纔會被其餘事務看見】
4.Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證。
** 對於多數應用程序,能夠優先考慮把數據庫系統的隔離級別設爲Read Committed,它可以避免髒讀,並且具備較好的併發性能。
** 每一個數據庫鏈接都有一個全局變量@@tx_isolation,表示當前的事務隔離級別。
在MySQL數據庫中查看當前事物的隔離級別:
select @@tx_isolation; 或者是 show variables like '%iso%';
在MySQL數據庫中設置事務的隔離級別爲 Read Committed :
set global transaction isolation level read committed;
若是遇到不容許修改:
是由於權限問題,先登出mysql,切換到root下,而後再去修改 @@tx_isolation
1.原子性(Atomicity)
是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾。所以事務的操做若是成功就必需要徹底應用到數據庫,若是操做失敗則不能對數據庫有任何影響。
2.一致性(Consistency)
一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態,也就是說一個事務執行以前和執行以後都必須處於一致性狀態。
拿轉帳來講,假設用戶A和用戶B二者的錢加起來一共是5000,那麼無論A和B之間如何轉帳,轉幾回帳,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。
3.隔離性(Isolation)
隔離性是當多個用戶併發訪問數據庫時,好比操做同一張表時,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。
即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始以前就已經結束,要麼在T1結束以後纔開始,這樣每一個事務都感受不到有其餘事務在併發地執行。
關於事務的隔離性數據庫提供了多種隔離級別,即上文提到的。
4.持久性(Durability)
持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做。
例如咱們在使用JDBC操做數據庫時,在提交事務方法後,提示用戶事務操做完成,當咱們程序執行完成直到看到提示後,就能夠認定事務以及正確提交,即便這時候數據庫出現了問題,也必需要將咱們的事務徹底執行完成,不然就會形成咱們看到提示事務處理完畢,可是數據庫由於故障而沒有執行事務的重大錯誤。
https://blog.csdn.net/dong976209075/article/details/8802778
http://blog.itpub.net/30127122/viewspace-2134370/
https://www.cnblogs.com/fjdingsd/p/5273008.html
https://www.cnblogs.com/ctaixw/p/5867414.html