跳到主要內容

發表文章

[筆記] Head First Design Patterns

Chapter 1 Welcome to Design Patterns: an introduction OO Basics: Abstraction Encapsulation Polymorphism Inheritance OO Principles: Encapsulate what varies. Favor composition over inheritence. Program to interfaces, not implementations. OO Patterns: Strategy - defined a family of algorithms, encapsulates each once, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. Chapter 2 Keeping your Objects in the know: the Observer Pattern OO Principles: Strive for loosely coupled designs between objects that interact. OO Patterns: Observer - defines a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. Chapter 3 Decorating Objects: the Decorator Pattern OO Principles: Classes should be open for extension but closed for modification. OO Patterns: Decorator - Attach additional responsibilities to an objec...

[Symfony+Doctrine] 透過非 Id 來使用 Pessimistic Lock

根據 文件 ,Doctrine 有 Pessimistic Lock,又分為兩種: LockMode::PESSIMISTIC_WRITE:對應至 MySQL 的 Select FOR UPDATE LockMode::PESSIMISTIC_READ:對應至 MySQL 的 Select LOCK IN SHARE MODE 差別在於 LOCK IN SHARE MODE 會將在 row 的資料鎖定(row-level lock),在非同一交易(Transaction)下,不給寫入,其他交易可以讀取, 且可以繼續 Select LOCK IN SHARE MODE 。而 FOR UPDATE 不僅鎖定該資料,在非同一交易下,不給寫入,其它交易可以讀取, 但不能 Select LOCK IN SHARE MODE 。MySQL 文件有更詳細的比較與情境使用的說明,參考 網址 。 現在問題是,我們要完全採用 ORM 來處理資料。Doctrine 的文件提到 EntityManager::find 可以採用 Pessimistic Lock, 但 find 是透過 id 來處理 。而其他 find 系列函數(包括:findAll, findBy, findOneBy)皆不支援 LockMode。 因此,勢必要有方法來「透過非 id 來使用 Pessimistic Lock」。透過查看原始碼,簡單的方法是有的,解法之範例如下: 19 public function depositAction() 20 { 21 22 $em = $this->getDoctrine()->getManager(); 23 24 $em->transactional(function ($em) { 25 $entityName = 'AcmeTrainingBundle:Account'; 26 $lockMode = LockMode::PESSIMISTIC_READ; 27 $orderBy = null; 28 $...

[轉貼]MySQL 交易功能 Transaction 整理 (XYZ的筆記本)

全文轉貼自: http://xyz.cinc.biz/2013/05/mysql-transaction.html   (XYZ的筆記本) ---------------------------------------------------------------------------------------------------------- 資料庫的交易(Transaction)功能,能確保多個 SQL 指令,全部執行成功,或全部不執行,不會因為一些意外狀況,而只執行一部份指令,造成資料異常。 MySQL 常用的兩個資料表類型:MyISAM、InnoDB, MyISAM  不支援交易功能,所以以下的整理,均是針對 InnoDB  而言。 交易功能4個特性 (ACID)  Atomicity (原子性、不可分割):交易內的 SQL 指令,不管在任何情況,都只能是全部執行完成,或全部不執行。若是發生無法全部執行完成的狀況,則會回滾(rollback)到完全沒執行時的狀態。 Consistency (一致性):交易完成後,必須維持資料的完整性。所有資料必須符合預設的驗證規則、外鍵限制...等。 Isolation (隔離性):多個交易可以獨立、同時執行,不會互相干擾。這一點跟後面會提到的「隔離層級」有關。 Durability (持久性):交易完成後,異動結果須完整的保留。 開始進入交易模式 SQL 指令: START TRANSACTION  或  BEGIN 結束交易模式 交易完成:使用  COMMIT  儲存所有變動,並結束交易。 交易過程異常:使用  ROLLBACK  回滾,取消交易,還原到未進行交易的狀態。(若交易過程連線中斷,沒 COMMIT 提交的變更,亦會如同執行 ROLLBACK 取消交易) 儲存點 (SAVEPOINT) 交易過程中,可標示多個不同的儲存點,有需要時可 ROLLBACK 到某個儲存點。 建立儲存點: SAVEPOINT 名稱 刪除儲存點: RELEASE SAVEPOINT 名稱 ROLLBACK 到某個儲存點: ROLLBACK TO SAVEPOINT 名稱 如...

尾聲-總結,一顆全新的硬碟開始

步驟 使用 fdisk 等工具查看硬碟的分區情況,確定要裝到哪個分區,記下分區的首磁區磁區號 $ bximage -q -hd -mode=flat -size=120 120m.img $ fdisk 120m.img 磁碟 120m.img: 125 MB,125411328 位元組 255 磁頭,63 磁區/磁軌,15 磁柱,總計 244944 磁區 單位 = 磁區 之於 1 * 512 = 512 位元組 磁區大小 (邏輯/實體):512 位元組 / 512 位元組 I/O 大小 (最小/最佳化):512 位元組 / 512 位元組 磁碟識別碼:0x00000000

尾聲-真正的尾聲

grub 系統已經在硬碟上順利執行了,我們仍然可以改進,讓它支持多重開機,採用現有的 grub 即可。 首先,先將開機磁區裝到 Orange'S 分區的開機磁區: dd if=boot/hdboot.bin of=$(HD) seek=`echo "obase=10;ibase=16;\`egrep -e '^ROOT_BASE' boot/include/load.inc | sed -e 's/.*0x//g'\`*200" | bc` bs=1 count=446 conv=notrunc dd if=boot/hdboot.bin of=$(HD) seek=`echo "obase=10;ibase=16;\`egrep -e '^ROOT_BASE' boot/include/load.inc | sed -e 's/.*0x//g'\`*200+1FE" | bc` skip=510 bs=1 count=2 conv=notrunc 並重新編譯(此時,硬碟 80m.img 的開機磁區還是 Orange'S 的開機磁區,可是在 80m.img5 的開機磁區也有 Orange'S 的開機磁區)。

關於Linux系統下Grub啟動流程的討論總結

關於Linux系統下Grub啟動流程的討論總結 轉貼來源: http://www.test104.com/tw/tech/603.html  全世界linuxer都知道grub是什麼東西,但對於MBR引導到grub再引導到具體作業系統的這個流程可能有不少朋友就比較迷糊了。這不,cu上一位朋友就發出了這樣一個求助貼:    假如現在一台電腦上裝了WIN2000系統,那麼我現在在裝上LINUX系統和GRUB,那麼假如把GRUB裝在主分區的話,GRUB直接引導 LINUX和WIN2000,我是可以理解的,因為MBR中是GRUB的STAGE1(對不對呢?),MBR通過檢查DPT分區資訊引導系統跳轉至DBR (活動分區),我這裏想問的活動分區是什麼時候設的呢?那麼裝GRUB到MBR裏,那原來MBR中的WIN的引導資訊是怎麼處理的呢?是不是我們假如說裝 GRUB到MBR的時候,GRUB就把GRUB所在那個區設置為了活動分區了呢?然後GRUB引導時候,MBR就找到那個活動分區找到所需要的檔,然後繼續呢?假如說把GRUB裝到其他分區(非主引導區)的話,那是怎麼樣實現GRUB先啟動的呢?不是先MBR嗎?因為裝到了其他分區,沒有改主引導區,因此主引導區還是WIN2000的引導資料啊,怎麼會GRUB先啟動了呢?這是為什麼呢?跟活動分區有關係沒有呢?我看資料上寫的是哪個系統啟動哪個系統就是活動分區,可是那樣的話,似乎就解釋不通了啊,就是最最開始這個地方一直不懂,理不清楚。

尾聲-從硬碟開機

我們要將 Orange'S 安裝到硬碟上,並實現硬碟啟動。 回憶軟碟啟動的過程: BIOS 將開機磁區讀入記憶體 0000:7C00 處 跳轉到 0000:7C00 處開始執行開機程式碼 開機程式碼從軟碟中找到 loader.bin,並將其讀入記憶體 跳轉到 loader.bin 開始執行 loader.bin 從軟碟中找到 kernel.bin,並將其讀入記憶體 跳轉到 kernel.bin 開始執行,到此可認為啟動過程結束 系統執行中 第 1 步中,係由 CMOS 來決定。第 3 步和第 5 步中, 軟碟啟動:程式碼將在軟碟中尋找 loader.bin 和 kernel.bin 硬碟啟動:需要讓開機磁區程式碼從硬碟中尋找 loader.bin 並讓 loader 從硬碟中尋找 kernel.bin 故我們必須重寫 boot.asm 和 loader.asm,讓它們讀取硬碟而不是軟碟。新的檔我們取名為 hdboot.asm 和 hdldr.asm。