327次衝突。
這個數字像刻在林夕視網膜上,無論他看向哪裏,都在視野邊緣跳動。會議室裏所有人都以為是37,包括他自己——在周凱給的臨時許可權裏,他看到的就是37。
但那個隱藏的查詢記錄不會說謊。有人在九點零五分,用更高的許可權查出了真實數字,然後選擇了保密。
周凱?
李工?
還是某個自己不知道的人?
林夕關掉電腦,走出公司時已近午夜。地鐵末班車剛走,他站在路邊等車,夏夜的風悶熱潮濕,帶著城市特有的尾氣和塵埃味道。
手機響了,是母親。
“小夕,還沒下班?”
“嗯,剛結束。”
“別太拚了,身體要緊。”母親的聲音裏是掩不住的疲憊,“你爸最近血壓又高了,醫生讓多休息,但他還是天天往學校跑……”
林夕聽著電話那頭的絮叨,忽然覺得鼻子發酸。父母在那個小城教了一輩子書,最大的驕傲就是他考出來,進了大城市的大公司。每次打電話,他們都說“挺好,別擔心”,但他知道,家裏的老房子該修了,父親的降壓藥不便宜,母親的風濕病一到陰雨天就發作。
他不能說今晚可能出了事故,不能說師兄可能在隱瞞資料,不能說這個看似光鮮的職位下麵,埋著多少看不見的裂縫。
“媽,我下個月發工資,給你們轉點錢。帶爸去市裏醫院好好檢查一下。”
“不用不用,你剛工作,用錢的地方多……”
又聊了幾句,結束通話電話。網約車到了,司機是個沉默的中年人,車裏放著老舊的粵語歌。林夕靠在車窗上,看著流光掠過的城市。
《孫子兵法·謀攻篇》:“故曰:知彼知己,百戰不殆;不知彼而知己,一勝一負;不知彼,不知己,每戰必殆。”
他現在算什麽?知道一點“己”——係統有問題,資料有異常。但“彼”是誰?周凱的真實意圖是什麽?那個327次衝突背後,到底牽涉多少使用者損失?那個隱藏的查詢者,為什麽沉默?
都是迷霧。
車停在租住的老小區門口。林夕上樓,開門,開燈。十五平米的單間,一張床,一張桌,一個簡易衣櫃。桌上還攤著那本《孫子兵法》,書頁在風扇吹動下微微翻卷。
他洗了把臉,坐在桌前。強迫自己冷靜下來,梳理線索:
第一,事實層麵:兌換係統有並發問題,可能導致重複扣款。今天上線彈窗後,問題暴露,至少有327次資料庫衝突(實際影響的使用者數可能更多)。
第二,應對層麵:彈窗已回滾。周凱同意在淩晨三點資料庫維護時,同步調整防重複提交引數(從60秒改回5秒)。
第三,隱藏資訊:有人知道真實衝突數是327,但未公開。這個人要麽是周凱,要麽是李工,要麽另有其人。如果是周凱,他為什麽隱瞞?如果是李工,為什麽不告訴自己?
林夕的目光落在兵法書上。祖父用紅筆批註的一段話映入眼簾:
“兵者,詭道也。故能而示之不能,用而示之不用,近而示之遠,遠而示之近。”
軍事是詭詐之道。所以,能打要裝作不能打,要打要裝作不打,近要裝作遠,遠要裝作近。
如果周凱在隱瞞……他在“示之”什麽?
林夕開啟手機,看了一眼時間:淩晨一點十五分。距離資料庫維護視窗還有一個多小時。
他做了個決定。
重新開啟電腦,遠端登入公司VPN。他沒有生產環境資料庫的直接許可權,但監控係統有個功能——可以檢視實時的慢查詢圖表,雖然沒有具體資料,但能看到趨勢。
登入,開啟監控平台。
淩晨的流量很低,慢查詢數量幾乎為零。兌換介麵的錯誤率曲線……林夕放大圖表,愣住了。
錯誤率不是緩慢下降。
是斷崖式下跌——從晚上十一點開始,幾乎垂直掉到了接近零的水平。
這不正常。彈窗回滾能緩解問題,但不可能讓錯誤完全消失。除非……
林夕切換到資料庫連線數的監控。積分資料庫的連線池,正常情況下應該保持20—50個活躍連結。但現在,活躍連線數是5。
太少了。
他心跳開始加速。開啟資料庫主機的係統監控——CPU利用率:3%。記憶體使用率:40%。磁碟IO:幾乎為零。
這不像一個承載著核心業務的資料庫。這像一個……備用庫?或者隻讀庫?
林夕猛地站起來,在狹小的房間裏走了兩圈。他想起李工白天說的話:“已經安排今晚淩晨三點做主從複製重建。”
但現在是淩晨一點半。維護還沒開始,資料庫為什麽已經像是進入了隻讀狀態?
除非……維護提前了。
或者,根本不存在什麽“重建”,而是某種……切換?
他拿起手機,想給李工打電話。但手指停在撥號鍵上——如果是周凱的決定,李工可能隻是執行者。如果是更高層的決策,自己這個新人貿然介入,可能適得其反。
《孫子兵法·軍形篇》:“善守者,藏於九地之下;善攻者,動於九天之上,故能自保而全勝也。”
善於防守的人,像藏在深深的地下;善於進攻的人,像行動於高高的天上,所以既能保全自己,又能獲得完全勝利。
他現在既不能“攻”,也不能“守”。隻能“觀”。
等待。
時間一分一秒過去。監控螢幕上的指標幾乎靜止,像暴風雨前的死寂。
淩晨兩點四十分。
林夕的眼睛已經有些幹澀,但他不敢移開視線。忽然,資料庫連線數跳了一下——從5變成30,然後又迅速掉回10。
有人連線了資料庫,做了操作,然後斷開。
緊接著,慢查詢圖表上出現了一個尖峰——一條INSERT語句,執行了整整2.3秒。對於簡單的插入操作來說,這個時間長得離譜。
林夕死死盯著那條語句的雜湊值,快速在筆記本上記下來。他無法看到具體內容,但監控係統會保留語句模板。等明天,他也許能通過其他途徑反查這是什麽操作。
兩點五十分。
兌換介麵的請求量監控,出現了一個詭異的波動——原本平穩的曲線,忽然在幾分鍾內歸零,然後又恢複。像是……服務重啟了?
三點整。
林夕屏住呼吸。按照計劃,現在應該是資料庫維護視窗的開始。
但監控上什麽也沒發生。沒有連線中斷,沒有服務抖動,一切平穩得可怕。
三點零五分。
他的手機震動了一下。是技術大群裏的@全體成員:
“【係統通知】會員積分資料庫主從重建已完成。其間服務平穩,無感知。感謝各團隊配合。”
傳送人:李工。
林夕盯著那條訊息,又看向監控螢幕。資料庫連線數依然在低位徘徊,CPU利用率沒有明顯變化,磁碟IO也沒有重建資料時應有的大流量寫入。
這不像是“重建”。
更像是……“切換”到了另一個已經準備好的從庫,而原來的主庫可能出了什麽問題,需要掩蓋。
三點二十分。
林夕關掉監控,躺到床上。眼睛很累,但大腦異常清醒。他想起祖父去世前的那個下午,老人握著他的手,聲音虛弱但清晰:
“小夕,這書……不是教你怎麽贏。是教你怎麽……不輸得太慘。”
“怎麽才能不輸?”
“看見別人看不見的。”祖父說,“聽清別人聽不清的。然後,等。”
“等什麽?”
“等該動的時候。”
窗外傳來早班清潔工掃地的聲音。天快亮了。
林夕閉上眼睛,腦海裏全是數字:327次衝突。從60秒改回5秒的引數。提前進入隻讀狀態的資料庫。那條長達2.3秒的神秘插入語句。
它們之間一定有關聯。
而他需要找到那條線。
清晨六點半,林夕被手機鬧鍾吵醒。隻睡了三個小時,頭痛欲裂。他衝了個冷水澡,強迫自己清醒。
到公司時還不到八點。辦公區空蕩蕩的,隻有保潔阿姨在拖地。林夕走到自己工位,開啟電腦,第一件事就是查昨晚那條慢查詢的詳細資訊。
通過監控係統的曆史查詢功能,他找到了那條語句的完整模板:
`sql
INSERT INTO exchange_pensation (user_id, order_no, amount, reason, create_time)
VALUES (?, ?, ?, ?, NOW)
`
補償記錄表?
林夕愣了。這張表他之前沒見過。他快速查了資料庫字典,確認這是一張三個月前新建的表,注釋寫的是:“積分兌換異常補償記錄”。
所以,昨晚有人在往這張表裏插入資料。給那些可能被重複扣款的使用者,做補償記錄?
那麽補償邏輯是什麽?誰批準的?錢從哪出?
他繼續查,發現這張表的訪問許可權被嚴格控製,隻有少數幾個人有寫許可權。其中之一是:Zhou.Kai。
另一個是:Li.Gang(李工)。
還有一個人:Chen.Qiming(陳啟明)。
陳啟明的許可權還沒有被移除——盡管他已經離職三年。
林夕靠在椅子上,覺得事情越來越複雜。如果周凱和李工在悄悄做補償,說明他們知道問題的真實規模。但為什麽要在深夜偷偷做?為什麽不走正常的客訴流程?
除非……他們不想讓問題被更多人知道。
除非,這個問題的責任,比表麵上看起來更嚴重。
八點半,同事們陸續到來。周凱準時出現在辦公區,和往常一樣和每個人打招呼。看到林夕時,他笑著走過來:
“昨晚辛苦了。聽說你忙到很晚?”
“查了一些資料。”林夕說。
“有什麽發現嗎?”周凱的語氣很隨意,但林夕注意到,他的目光在自己螢幕上停留了一瞬。
“錯誤率降下來了,使用者反饋好像也少了。”林夕選擇說安全的部分。
“那就好。”周凱拍拍他的肩,“今天你休息一下,不用太拚。那個優化方案可以慢慢寫,不著急。”
他走開後,趙磊溜過來,壓低聲音:“聽說了嗎?昨晚出大事了。”
“什麽事?”
“具體的不知道,但聽說客服那邊半夜接到幾十個投訴,運營的人都被叫起來緊急處理。”趙磊神秘兮兮地說,“而且我早上看到財務的小王在跟蘇晴吵架,好像跟什麽補償款有關。”
林夕的心一沉:“吵什麽?”
“好像是說,有一筆預算外支出,沒走正常流程,財務不認賬。”趙磊說,“蘇晴堅持說那是技術問題導致的使用者損失,必須賠。財務說那也得先立項審批……”
話沒說完,周凱的聲音從辦公室門口傳來:“趙磊,你昨天那個需求做完了嗎?還有空閑聊?”
趙磊吐吐舌頭,溜回工位。
林夕看向周凱的辦公室。玻璃門關著,百葉窗拉下一半。周凱坐在裏麵,正在打電話,表情嚴肅。
透過百葉窗的縫隙,林夕看到了一樣東西。
周凱的辦公桌上,放著一份列印出來的報表。報表最上方的一行標題,因為反光看不清楚,但下麵那個數字,林夕認得。
327.
正是昨晚那個隱藏查詢的結果。
周凱知道。他不僅知道,還把報表列印出來,放在桌上。
那麽他昨晚在會議上隱瞞資料,今天早上又裝作若無其事,到底是想幹什麽?
林夕忽然想起《孫子兵法》裏最著名的一句話:
“兵者,詭道也。”
而此刻,這條詭道正從他眼前延伸出去,通往某個他尚未看清的目的地。
窗外的陽光正好,斜斜地照進辦公區,在地板上切出明暗交錯的格子。
新的一天開始了。
但昨夜埋下的種子,已經開始在暗處生根。
隻是這一次,林夕決定,他不能再被動等待。
他需要知道,那327次衝突的背後,到底藏著什麽。以及,周凱桌上那份報表,究竟意味著什麽——是準備承擔責任的證據,還是計劃下一步行動的藍圖?
他開啟檔案,開始寫一封郵件。收件人:李工。主題:關於申請兌換係統曆史異常資料完整許可權的說明。
在點選傳送的前一秒,他停頓了一下,然後,在抄送欄裏,緩緩輸入了一個人的名字。
不是周凱。
是技術部總監的郵箱——那個隻在全公司大會上見過,從未直接打過交道的,真正的技術負責人。
手指懸在滑鼠上方。
陽光移動,照亮了鍵盤。
他按了下去。