資料庫幻讀解決方案

2021-10-07 00:25:07 字數 1305 閱讀 2113

有時候我們會有業務場景去解決資料庫幻讀現象:(比如某條記錄的某幾個屬性合起來需要在記錄裡唯一) 

這個時候我們需要做的是新增乙個校驗欄位對他做唯一約束,值是這幾個欄位的拼接

這裡為什麼用校驗欄位而不用原字段呢? (有時候我們在做刪除的時候只做邏輯刪除 這時候唯一約束就好導致失效的記錄讓有效的記錄無法插入, 而校驗欄位不一樣 你在做失效處理的時候給校驗欄位賦乙個隨機值就好了)

一般要解決幻讀的場景我們都需要(不存在插入並且返回插入值 存在直接查詢結果值)

以下是**示例

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.幻讀指新插入的行,讀到原本存在行的更新結果不算。因為當前讀的作用就是能讀到所有已經提交記錄的最新值。產生幻讀的原因是,行鎖只能鎖住行,但是新插入記錄這個動作,要更新的是記錄之間的 間隙...