應用程式運算元據庫表時,需要長時間(可能要幾分鐘,甚至十來分鐘)修改資料表的資料,而在整個過程中,不容許別的使用者運算元據(即只能單使用者運算元據),這種情況,相當於要把表鎖住(跟資料庫概念的鎖不一樣),等執行完後,解鎖,別的使用者才可以運算元據。就這種問題,有以下幾種種解決方案。
1.設定標記字段(flag)
在操作前設定標記為正在操作,執行完成後標記復原。執行開始時,檢查這個標記欄位是正在操作狀態還是未操作狀態,從而決定是否繼續執行當前操作。
缺點是,如果在執行過程中,客戶端和資料庫伺服器的連線斷開,則標記欄位被標記為正在操作狀態,此時,需要人工到後台資料庫修改欄位到未操作狀態,其他客戶程式才能執行。可能會想到,打標記和復位標記用事物控制,帶來的問題是事務中間的得到的資料在發生物理錯誤時也丟失了。
2. 在應用程式中,建兩個資料連線的物件。
乙個(pubconn)用來連線資料、運算元據表,另乙個(pubconnlock)用來控制單使用者操作(鎖表)。
2.1方法a 建一張上鎖用的空表
如建一張名test的表,只有id乙個字段。
pubconnlock.begintrans '開啟事務
strsql = "select * from test with (tablockx)"
pubconnlock.execute (strsql)
'''''''
'長時間操作表的模組,運算元據用的資料庫連線物件是pubconn不能是pubconnlock。
''''''''
pubconnlock.committrans
查詢語句 「select * from test with (tablockx)」執行時會在系統表dm_tran_locks 中生成一條request_mode='x'"的記錄行,下面是查鎖的語句
sqlstr = "select * from sys.dm_tran_locks where resource_associated_entity_id=object_id('dbo.test') and request_mode='x'"
在每次首席執行官時間操作表的模組之前,檢查該鎖是否存在,存在則不執行,不存在時才能執行,這樣就能達到單使用者操作的目的了。
2.2 方法b 記錄每個執行過程在乙個表中
建一張表test,只有乙個字段(operatename),儲存應用程式運算元據過程的字段。
pubconnlock.begintrans '開啟事務
strsql = "select * from test with (updlock,readpast) where operatename='functionmodule1'" '功能模組1
rs.open sql, pubconnlock, 1, 1
if rs.recordcount > 0 then
'''''''
'長時間操作表的模組,運算元據用的資料庫連線物件是pubconn不能是pubconnlock。
''''''''
end if
pubconnlock.committrans
with (updlock,readpast),updlock:讀取表時使用更新鎖,而不使用共享鎖,並將鎖一直保留到語句或事務的結束。updlock 的優點是允許您讀取資料(不阻塞其它事務)並在以後更新資料,同時確保自從上次讀取資料後資料沒有被更改。readpast: 會把被鎖住的行直接過濾。因此,select * from test with (updlock,readpast) 就是把未被鎖住的行讀出來並把這些行加鎖,也就是在當前這個程序中執行的事務獲取的記錄行,在別的程序中查詢不到。
函式的獨佔時間 python
題目描述 給出乙個非搶占單執行緒cpu的n個函式執行日誌,找到函式的獨佔時間。每個函式都有乙個唯一的 id,從0到n 1,函式可能會遞迴呼叫或者被其他函式呼叫。日誌是具有以下格式的字串 function id start or end timestamp。例如 0 start 0 表示函式 0 從 ...
636 函式的獨佔時間
題目 給出乙個非搶占單執行緒cpu的 n 個函式執行日誌,找到函式的獨佔時間。每個函式都有乙個唯一的 id,從 0 到 n 1,函式可能會遞迴呼叫或者被其他函式呼叫。日誌是具有以下格式的字串 function id start or end timestamp。例如 0 start 0 表示函式 0...
演算法 函式的獨佔時間
昨晚通宵發版,導致今天狀態很差。思路有點亂 這個題目來自leetcode 636.函式的獨佔時間 題目不複製了 題解 理解題意 函式的呼叫,代表函式一定是閉合的。也就是說,子函式結束之前,母函式一定是沒有結束的。母函式的結束一定在子函式結束之後。這個解法,巧妙的地方在於casttime的運用。這樣,...