通俗地講就是存儲和管理數據的方式
形象例子:
某處地方的自行車管理員:李某,張某。每天都有很多人來存取自行車。李某的管理方式是: 車主自行存放,李某也不記錄對方存的是什麼車。取車時則要交管理費。也不檢查取的是否是對方自己的車。相反,張某,則在車主存放車時,記錄存放人的特征以及對應車的信息。當人來取車時,張某還要小心核對,人與車的特征是否對應。
從上述例子可知:
a、從效率的角度來看: 李某比張某快,因為其不用進行校對
b、從安全性的角度來看: 張某比李某要安全,因為其進行了校對。
總結: 實際上,mysql的存儲引擎也是這樣工作,每種存儲引擎都有自身的存取方式,因此在選擇上,應該根據實際情況來定。
1、如何查看mysql的引擎
mysql> show engines;
2、常用的存儲引擎myisam與innodb的區別
2.1、myisam: 批量插入速度快,不支持事務,表鎖
innodb:批量插入速度相對較慢,支持事務,行鎖
二、事務
通俗地理解,指一組操作,要麼都成功執行,要麼都不執行。
例如:
用戶A給用戶B轉賬500元
先分析下這個流程:
1、判斷用戶A的卡余額是否大於500元,否則,則無法進行轉賬操作
2、在滿足大於500元的基礎上,用戶A給用戶B進行轉賬
3、轉賬操作成功,則用戶A的卡余額減去500元,用戶B加上500元
用程序描述下這個過程
query($sqlA); if( $resultA ) { $sqlB = "update user set money=money+500 where name='userB'"; //步驟B $resultB = $db->query($sqlB); if( $resultB ) { return true; }else { $sqlA = "update user set money=money+500 where name='userA'"; //步驟C $resultA = $db->query($sqlA); return false; } } $sqlA = "update user set money=money+500 where name='userA'"; //步驟D $resultA = $db->query($sqlA); return false; ?>
從事務的角度看:
1、在轉賬過程中,出現有誤,則該錯誤對雙方而言,是沒有影響的。即不可能因為某個錯誤,導致用戶A白白減少500,而用戶B莫名其妙多了500
2、在轉賬過程中,用戶A是不可能看到自己的卡余額減下500,而用戶B也是無法看到自己增加500元,因為轉賬操作還未結束。
3、單單從這個過程,用戶A與用戶B的總金額是不變的。只不過是一方減少,另一方增加
總結下事務的幾個特性
a、 原子性:一組操作,要麼都成功執行,要麼都不執行
b、 隔離性:在所有的操作沒有執行完畢之前,其它會話不能夠看到中間改變的過程
c、 一致性:事務發生前和發生後,數據的總額依然匹配
d、 持久性:事務產生的影響不能夠撤銷