1、首先mysql資料庫的預設事務隔離級別為:repeatable-read 可重複讀。
2、如果不是上述隔離級別,請先修改隔離級別為可重複讀,修改方法如下:
3、開啟兩個命令列視窗,分別登入mysql,並命名為session1和session2,以模擬兩個消費者消費模擬佇列的資料(已提前儲存好6條佇列資料,不再模擬生產者的行為)。注釋:id為自增主鍵、session用來儲存sessionid,msg是待消費的資料體,status是消費狀態(un_use:未消費,using:消費中,used:已消費)。
4、分別在session1和session2中開啟事務,並查詢此時佇列中的資料狀態,可以看到全部為un_use狀態。
5、現在開始消費,session1先消費,假設每次消費2條。
6、假如此時session2併發消費訊息
情況(1)如果session1還沒有commit事務,session2需要等待,一直等到session1提交事務(見情況(2)),或者session2超時回滾或重試。
情況(2)如果session1已經commit事務,則神奇的一幕出現了。
可以看到:session2執行update語句更新資料,更新的是id=1008,1009的兩條訊息!!!(講道理應該更新1006,1007,為什麼會更新1008和1009呢?除非,session2感知到了1006和1007被session1更新過了,但是從select結果上看,session2並沒有感知到1006和1007已變化,這是乙個神奇的東西,或許和mvcc有關,請懂的大牛們指教!)
7、既然如此,session1和session2都拿到了自己應該處理的訊息,那就可以進行訊息處理了,處理完訊息以後,通過id來更新資料庫狀態就不存在併發問題了。
8、通過上面兩session交替執行更新,可以進行併發更新,周而復始。
9、如果執行過程中session中斷,則會造成一部分using狀態的資料變成殭屍資料,此時可以結合定時任務,對using資料進行進行掃瞄。
mysql資料庫效能資料 MYSQL資料庫效能優化
1.選取最適用的字段屬性 表中字段的寬度設得盡可能小 char 的上限為 255 位元組 固定占用空間 varchar 的上限 65535 位元組 實際占用空間 text 的上限為 65535。盡量把字段設定為 not null,執行查詢的時候,資料庫不用去比較 null 值。2.使用連線 join...
C實現MySQL資料庫操作
兩個月前,也就是9月份,心血來潮在windows下實現了用c連線資料庫,當時很是有把linux下一併給實現了。但是沒有想得那麼簡單。這個任務一直推遲到了現在才完成,究其原因 1.我直接用eclipse開發工具,對於環境變數的設定不是很熟。2.linux系統庫檔案結構不熟悉,對於mysql提供的庫檔案...
JAVA實現mysql資料庫連線
實現資料庫連線 功能 獲取乙個資料庫的連線,public static connection getconnection catch classnotfoundexception e catch sqlexception e return conn 注意 public static void mai...