Jump to...
redirecting...

Log for OKTW Network

我正在思考我該怎麼讓程式內的資料和DB同步
每次從DB取出都會生一個新物件阿
如果修改了之後存進DB,其他物件並不會跟著更新
不懂意思
++
就是假如從DB內取出一個user,每取一次就會生成一個不同的物件
然後某個地方修改了其中一個物件,並且存回DB了
其他的物件的資料並不會一起更新
為什麼會分散在四處(?
然後如果另一個也修改並儲存進DB,前一個變更就會被蓋掉
因為每次從DB中抓資料都是生成新物件阿
搞個cache,讓第二次從DB抓資料時直接返回現成的物件?
可是這樣cache不會無限變肥嗎
你可以讓他寫入時不一致直接失敗啊
問題是該如何檢查不一致
給他一個遞增加版本號
update時加一
然後同時用where限定你要改的版本
聽起來是可行可是感覺好麻煩(
要是你uodate之前,有人就改了他,你的update就會因為query不到東西噴了
你可以讓這物件跟DB綁定吧?
要怎麼綁,我用mongodb
我覺得我一整個摸到 Java EE 的領域去了
我覺得你想要的是lock,避免一個物件被兩個伺服器同時讀取導致desync
為什麼會同時有A B
因為從資料庫抓兩次就會生出兩個物件
我是說
為什麼你要抓兩次
可是資料從取出到更新的時間可能無限長
read lock(可以讀,鎖定寫入)/ read write lock(完全獨佔)
你不是單SV架構ㄇ
有兩個地方需要抓資料啊
還是多SV
這裡的地方是指什麼
目前還是單個server實例,未來可能會弄成多個
兩個SVㄇ
寫入之前再 query 一次最新的,並且加上 read write lock 阿
一個方法就boardcast 過去
就像jaba多線程一樣
另一個就lock
還是有機會因為時差爆炸啊
好像也是
我就這樣幹好了
是說 我還是不太懂什麼情況會要同時存取
有什麼好不懂的,就同時有兩個用戶存取了同一個資料啊
不過如果是數值增加的操作,其實有原子操作,不需要這樣做
然後兩個用戶不同SVㄇ
$add 什麼的
這完全不重要啊
滿重要
不怕race condition爆炸
同SV你就直接傳ref啊
那我就變成物件裡的所有值都必須自幹更新操作了.-.
你要ref去哪裡
這樣做挺正常的啊,mongodb本來就這樣更新
Ref去已經query出來的那個物件
除非妳用mongoose包好包滿
那要怎麼知道資料已經沒有任何人存取了
而且你要怎麼知道要ref到哪裡.-.
把query和物件做map嗎
然後那個map就無限增肥這樣
最後一個存取的disp掉啊
我用mongodb的pojo包好包滿
如何知道是最後一個存取啊
每次讀都加個訂閱?
讀完再取消訂閱?
聽起來超麻煩
而且還必須自己實作訂閱
沒有lock麻煩
DB有內建lock吧
而且比較省RAM
重點是你根本不需要開出兩個物件r
mongodb 沒有,不過你可以用atomic寫一個出來
[sticker](media:AAQFABOJJx0sAAQeYKfU8XnhsvFqAQABAg@telegram)
我可不可以樂觀一點相信不會同時有兩個寫入
只要確保寫入前query最新資料就好
最前面講的版本號不好嗎?
但是不符合時還是要query最新資料不是嗎
反正你都說發生機率不會很高了
寫入前再 query 最新的就好
我覺得我講的方法最簡單阿
findOneAndUpdate 和 updateOne 有什麼差別阿