mysql事物處理

2022-09-17 00:54:12 字數 1133 閱讀 7777

原子性:組成事物處理的語句形成了乙個邏輯單元,不能只執行其中一部分。換句話說,事物是不可分割的最小單元。比如銀行轉賬過程中,必須同時從乙個賬戶減去轉賬金額,並加到另乙個賬戶中,只改變乙個賬戶是不合理的。

一致性:在事物處理執行前後,mysql資料庫是一致的。也就是說,事物應該正確的轉換系統狀態。比如銀行轉賬過程中,要麼轉賬金額從乙個賬戶到另乙個賬戶,要麼兩個賬戶都不變,沒有其他情況。

隔離性:乙個事物處理對另外乙個事物處理沒有影響。比如說銀行轉賬過程中,在轉賬事物沒有提交之前,另乙個轉賬事物只能處於等待狀態 。

可靠性:事物處理的效果能夠被永久儲存下來。反過來說,事物能夠承受所有的失敗。包括伺服器,程序,通訊以及**失敗等等。比如銀行轉賬過程中,轉賬後賬戶的狀態要能被儲存下來。

mysql中只用innodb和bdb型別的資料表才能支援事物處理(切記)!

購書成功

表面上看甲乙的操作都成功了,他們都買到了書,但是庫存只有一本,他們怎麼可能都成功呢?再看看資料表裡book_number的內容,已經變成「-1」了,這當然是不能允許的(實際上,宣告這樣的列型別應該加上unsigned的屬性,以保證其不能為負,這裡是為了說明問題所以沒有這樣設定)

好了,問題陳述清楚了,再來看看怎麼利用事務來解決這個問題,開啟mysql手冊,可以看到想用事務來保護你的sql正確執行其實很簡單,基本就是三個語句:開始,提交,回滾。

那是不是只要用事務語句包一下我們的sql語句就能保證正確了呢?比如下面**:

答案是否定了,這樣依然不能避免問題的發生,如果想避免這樣的情況,實際應該如下:

由於加入了for update,所以會在此條記錄上加上乙個行鎖,如果此事務沒有完全結束,那麼其他的事務在使用select ... for update請求的時候就會處於等待狀態,直到上乙個事務結束,它才能繼續,從而避免了問題的發生,需要注意的是,如果你其他的事務使用的是不帶for update的select語句,將得不到這種保護。

Django處理MySQL事物的用法

資料庫事務 在儲存訂單資料中,涉及到多張表 orderinfo ordergoods sku 的資料修改,對這些資料的修改應該是乙個整體事務,即要麼一起成功,要麼一起失敗。django中對於資料庫的事務,預設每執行一句資料庫操作,便會自動提交。我們需要在儲存訂單中自己控制資料庫事務的執行流程。在dj...

thinkphp oracle 事物處理

在使用sqlite大批量的插入資料時間,發現sqlite的響應資料相當慢,不管是php還是.net都是如此。後來在網上找到sqlite的插入機制,知道要在插入時使用事務,可以加速。sqlite的事務請使用begin和commit,以下以php為例 使用的框架是thinkphp 在tp中可以直接使用s...

PHP MYSQL 事物處理

php mysql 事物處理,首先資料庫設計時,必須能夠支援事務,所以在設計資料表時,選擇 innodb 作為資料庫的引擎,如果選擇資料庫的引擎不支援事務,例如 myisam 可以通過表鎖定的方式 以下是乙個事務實現的簡單的例子 資料庫名 test 資料表 person表,phone表 person...