1. 幻讀。很多書和blog都提到mysql 的 tx_isolate (事務隔離)為repeatable read. 並且mysql做了next-key lock的事情防止幻讀。但是如果你直接在事務中使用
select * from [table];
這還是會有幻讀發生。只有你在select語句中加入鎖才能防止幻讀。例如:
select * from [table] for update;
select * from [table] lock in share mode;
以上兩句都可以防止幻讀。第二句要優於第一句,因為加的是讀鎖而不是寫鎖。
另外介紹一下幻讀:
幻讀就是當乙個事務進行查詢時沒有發現該記錄,或者沒有發現該記錄被更改。結果在正在插入該記錄或者真正要改該記錄時,發現這條記錄已經被其他事務改過了。
例如事務1, select * from [table];
這時進行事務2, insert into [table] select xx; commit;
事務1 再執行 select * from [table]; 這裡是沒有 事務2 的資料的。
這裡只要事務1再次執行 insert into [table] select xx; 這樣就發現這個行已經存在了;這就是幻讀。
2. 另外發現update的乙個問題。如果使用事務, 首先select 資料然後再使用該資料進行update,有可能會有問題。一般使用 update [table] set col = col + value where ...這種形式進行更新,比select col from [table]; 取到col然後再進行update [table] set col = 剛才select 出的col value + value; 這樣更加正確,因為update自身可以加寫鎖。保證了不會幻讀。
3. 另外乙個問題涉及到 limit. 例如 select * from [table] limit [len] offset [offset]; 如果這裡offset比較小,那麼這樣做是可以的。如果這裡offset很大,那麼這樣做類似於掃表。這裡需要使用where子句來加速。
mysql使用遇到的問題
1 開啟linux視窗,啟動mysql。2 連線mysql輸入show variables like character 出現如下圖,這樣的話在linux下操作mysql會出現中文亂碼,所以我們要解決這個問題。3 關閉mysql,找到 etc mysql mysql.conf.d mysqld.cn...
mysql使用中遇到的問題
問題一 第一次mysql啟動服務失敗,未返回報錯資訊 解決方法 執行 mysqld console命令,檢視error資訊,對症下藥 但一般情況下,主要是因為mysql目錄下的data資料夾中內容不正確,解決方法有以下兩個 1.在開啟服務前執行初始化命令 mysqld initalize 然後啟動服...
MySQL分頁使用limit遇到的問題
今天使用elementui元件進行分頁,編寫完畢之後,進行測試,發現好像 不對的樣子 總共25條資料,但是三頁,每頁都有10條資料,我輸出了接收的引數,好像沒問題,於是在資料庫使用sql,進行模擬分頁,才發現我把limit的用法搞混淆了,limit一共有兩個引數,我把第乙個引數誤認為是當前頁,第二個...