在之前的文章已經談過很多關於MySQL 資料庫鎖定 的觀念及實作,這篇把所有的觀念一次整合在一起,也比較容易完全理解MySQL的鎖定如何應用在實際的系統設計上。 鎖定的定義 : 在 MySQL 中,資料庫的鎖定是一種用於管理多用戶或程序同時訪問同一資料庫資源時的同步機制。鎖定可以幫助預防資料不一致和更新衝突,保護交易的完整性。 既然是鎖定,當然就會讓某一方等待,如果鎖得不好,就會發生死鎖 (deadlock)。 因此鎖定就是為了達成資料的一致性及完整性,犧牲某些效率的做法。你不可能既要資料的一致性及完整性,又要求任何連線都不能等待。在非常大量連線的情況下,這些等待都可能造成程式超時 (timeout) 。 例如php程式的預設超時 (default timeout) 是30秒,MySQL的預設鎖定等待超時 (lock wait timeout)是50秒,如果因為等待而超過,程式就會停止並顯示錯誤訊息。如果拉長預設超時,當遇到死鎖或是大家都在等待,就更可能吃光系統的資源,讓正在執行的更緩慢。 因此,多人連線的系統,正確的處理交易以及正確的使用鎖定是很重要的,並且正確性與效能是同樣重要的事情。 有些系統效能比正確性還重要 (例如臉書的數據處理),有些系統正確性比效能還重要 (例如銀…
什麼是交易(Transaction 很多人稱為事務)功能? 交易(或事務)指的是一連串的指令,並且把它們作為一個單一的工作單位執行。這些操作要嘛全部執行,要嘛全部取消。 交易主要用於保證資料的一致性和完整性,特別是在多用戶環境中,其中多個操作可能同時對相同的資料進行讀寫。 例如一個訂單的完成,包含「將庫存資料表的數量更新」,然後「將訂購的商品資料寫入訂單資料表」。 這兩個動作如果不是都完成,就會產生問題。例如庫存資料表的數量已經-1,但是訂單資料沒有寫入,那麼庫存數量就發生錯誤了;或是訂單資料已經寫入,但是庫存的數量-1發生錯誤,這樣也會發生資料一致性的問題。 例如以下的PHP程式 order.php : <?php include 'conn.inc.php' ; // 引入連線設定檔 // 從 myproducts 表抓取產品 $query = "SELECT pid, pname FROM myproducts" ; $result = $conn ->query( $query ); // 檢查訂購按鈕是否被點擊 if ( $_SERVER [ "REQUEST_METHOD" ] == &qu…
如果你使用InfinityFree的空間寫PHP程式,你會發現程式再怎麼錯誤,都看不到錯誤訊息。 因為InfinityFree的預設,PHP的錯誤是不顯示的。 但是如果不顯示錯誤訊息,將會造成除錯的困難,因此我們需要將預設修改,修改方式如下 : 我們只需要將 Display Errors 改為 On,順便將PHP Time Zone 改為 Asia/Taipei。 以上這個畫面的進入點是 : 到你的InfinityFree Home,點選你的帳號後,由 Account Options 的 Domains 進入,再由 PHP Options 進入,即可看到以上畫面。 為何InfinityFree的Display Errors要預設為 Off 呢? 通常系統開發完成之後,會不希望執行時出現編譯錯誤的訊息,而希望所有的錯誤都由程式系統自己處理,因為有時候產生錯誤後,並不需要暫停執行程式,而是由程式自行處理。 但是在程式的開發階段,錯誤訊息就很重要了,因為可以進行除錯。 另外,InfinityFree中還有一個最讓人搞不清楚的就是系統時間。 InfinityFree的MySQL/MariaDB有自己的時區設定 (設定為SYSTEM,比台灣時間慢12小時),PHP也有自己的時區設定。 …
我們在" 如何利用ChatGPT等人工智慧工具,深入學習資料庫技能? "提到可以使用ChatGPT來學習習資料庫技能,更在" 有了人工智慧生成工具之後,MySQL教學型態會產生什麼變化? "說到 : 「設計者只需輸入對資料庫的需求描述,AI即可自動生成對應的SQL語句、關係模型和各種設計文件」。 現在我們將使用ChatGPT 3.5 免費工具來進行協同設計MySQL資料表單,以及撰寫PHP程式,看看整個程序是否可以順利進行。 第一個專案的需求如下 : (1) 建立一個MySQL database,字元集utf8mb4,排序原則utf8mb4_general_ci (2) 以正規化的精神規劃一個「訂單資料管理系統」,可以列出以下訂單資料表 : (3) 並且點選訂單日期,可以修改訂單日期。 (4) 並且列出訂單資料表或是修改訂單日期時,都必須先登入。 我們就在ChatGPT 3.5 開始輸入指令如下 : 建立一個MySQL database,字元集utf8mb4,排序原則utf8mb4_general_ci 請給我MySQL指令。 從ChatGPT得到了建立資料庫的指令 : CREATE DATABASE your_database_nam…