我已經學會了一點關於數據庫完整性的知識,並且知道如果我「需要多個語句作爲一個單元執行以保持數據處於一致狀態,我應該使用事務」。 Database development mistakes made by application developers(點16,選擇的答案)什麼事務會降低數據的完整性?
Wikipedia使用例如:
- 借記$ 100雜貨費用帳戶
- 信用$ 100支票帳戶
如果我嘗試存入一筆非 - 存在的帳戶ID,並正確使用約束,將引發異常,我可以捕捉它並回滾。如果發生停電,這兩個變化保證是原子的。
但是,如果我理解正確,自己的交易將不會幫助我在所有的情況下(例如使用PHP和MySQL)
- MySQL的:開始交易
- MySQL的:選擇數據從表
- PHP:計算狀態與所選擇的數據
- PHP:如果狀態是有效的,插入數據
- PHP:
這是行不通的,因爲查詢可以同時執行原子不會失敗時提交事務(它的PHP是決定有:否則,請不要將數據
那麼我該怎麼辦?我想鎖定一張桌子是可行的,但那是一個好習慣嗎?一些條件可以用SQL在單個語句中描述,但更復雜的條件不能。
嗯,如果我明白這隻對簡單的情況有用,但(這不是問題的要求)。例如,'SELECT ... FOR UPDATE'很重要,但它只適用於使用一行的情況。與'select ... where value = old value'一樣。很高興知道它,但如果我需要選擇大量數據並計算結果以決定是否繼續前進,該怎麼辦?在這些情況下表格鎖定是否可以接受(這似乎是我應該非常小心的事情)? – Raekye
@Raekye這兩種技術都可以用於多行,但選擇更新將更容易,因爲它會鎖定所有選定的行。 –
我的意思是如果我從多行中選擇數據 - 即使是沒有更新的表,但用於計算條件以查看是否應該插入另一行 – Raekye