使用mysql遇到的問題

2021-06-19 17:51:06 字數 1081 閱讀 1052

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一共有兩個引數,我把第乙個引數誤認為是當前頁,第二個...