有時候我們會有業務場景去解決資料庫幻讀現象:(比如某條記錄的某幾個屬性合起來需要在記錄裡唯一)
這個時候我們需要做的是新增乙個校驗欄位對他做唯一約束,值是這幾個欄位的拼接
這裡為什麼用校驗欄位而不用原字段呢? (有時候我們在做刪除的時候只做邏輯刪除 這時候唯一約束就好導致失效的記錄讓有效的記錄無法插入, 而校驗欄位不一樣 你在做失效處理的時候給校驗欄位賦乙個隨機值就好了)
一般要解決幻讀的場景我們都需要(不存在插入並且返回插入值 存在直接查詢結果值)
以下是**示例
public comarea findareaoradd(string comcode, string name, string flag, boolean throwexception) ", name);
throw new baseruntimeexception("0x00110301", "更新失敗 請檢查name是否位空");
}comarea comarea = new comarea();
comarea.setcomcode(comcode);
comarea.setcomareaid(uuid.randomuuid().tostring().replace("-", ""));
comarea.setname(name);
string comflag = "1" + flag.substring(1, flag.length());
comarea.setcomflag(comflag);
comarea.setflag(flag);
comarea.setvalid("y");
comarea.setdatecreate(new date());
comarea.setdatemodify(new date());
//因為幻讀會導致生成重複的code code=>comcode+name md5生成的
string code = digestutils.md5digestashex((comcode + name).getbytes());
comarea.setcode((comcode + code).substring(0, 32));
//standardcode 做了唯一約束刪除的時候要給standardcode乙個隨機值
comarea.setstandardcode(comarea.getcode());
comarea comarea1 = null;
try catch (exception e) else
}return comarea1;
}
幻讀以及幻讀的解決方案
事務a 事務b事務a按照特定的條件查詢資料,查詢到了2條資料 事務b插入一條資料 commit 事務a按照原條件查詢資料,查詢到還是2條資料 事務a修改其中一條資料的值update,看到修改的範圍是3條資料 事務a按照原條件查詢資料,查詢到3條資料 為什麼出現幻讀 主要原因是快照讀和當前讀混合使用 ...
幻讀及其解決方案
在乙個事務開始 第一條sql執行後真正開始 後由於其他事務提交後插入或刪除了資料,導致多次查詢的結果不一樣。表中的每條資料都會新增兩個字段 事務開始後查詢獲取到的資料的範圍 建立版本號 當前事務版本號 保證取出的資料不會有後啟動的事務中建立的資料。刪除版本號為空或 當前事務版本號 保證了至少在該事務...
Mysql鎖 幻讀解決方案 間隙鎖
1.在可重複讀隔離級別下,普通的查詢是快照讀,是不會看到別的事務插入的資料的。因此,幻讀在 當前讀 下才會出現。2.幻讀指新插入的行,讀到原本存在行的更新結果不算。因為當前讀的作用就是能讀到所有已經提交記錄的最新值。產生幻讀的原因是,行鎖只能鎖住行,但是新插入記錄這個動作,要更新的是記錄之間的 間隙...