天天看點

mysql 原子操作

mysql單表update是原子性的嗎
您好,外鍵限制對子表的含義: 如果在父表中找不到候選鍵,則不允許在子表上進行insert/update 外鍵限制對父表的含義: 在父表上進行update/delete以更新或删除在子表中有一條或多條對應比對行的候選鍵時,父表的行為取決于:在定義子表的外鍵時指定...
mysql事務的四大特性
事物操作資料庫的四大特性(ACID)1.原子性 (Atomicity) 原子性:就是事物的所包含的所有操作事物的社大特點展現在了很多方面。這個是我的斯大特性,應該有固定的說明,可以在百度上搜尋Myspe事物的四大特性,這個事物的四大特性,這些字母代表什麼?我不懂啊,不明白大特特是什麼?這個的話是給
MySQL導入導出資料如何實作?
  php?table=tablename 
這個簡單的程式目前一次儲存一個表格!!每行為一個字段的資料!! 
if($table==“”)exit(); 
mysql_connect(“localhost”,“name”,“password”); 
mysql_select_db(“database”); 
$result = mysql_query(“select * from $table”); 
if(mysql_num_rows($result) 
導入的程式如下:用法同上面! 
if($table==“”)exit(); 
mysql_connect(“localhost”,“name”,“password”); 
mysql_select_db(“database”); 
$message = fi1e(“$table。
MySQL導入導出資料如何實作?
  php?table=tablename 
這個簡單的程式目前一次儲存一個表格!!每行為一個字段的資料!! 
if($table==“”)exit(); 
mysql_connect(“localhost”,“name”,“password”); 
mysql_select_db(“database”); 
$result = mysql_query(“select * from $table”); 
if(mysql_num_rows($result) 
導入的程式如下:用法同上面! 
if($table==“”)exit(); 
mysql_connect(“localhost”,“name”,“password”); 
mysql_select_db(“database”); 
$message = fi1e(“$table。
mysql 設計表第一範式 原子性限制是什麼意思
CRegularExpressionValidator –
正則驗證屬性allowEmpty – 是否為空(預設true)
not-是否反轉的驗證邏輯(預設false) pattern – 正規表達式比對執行個體:
// 比對a-z array(‘username’, ‘match’, ‘allowEmpty’=>true, ‘pattern’=>’/[a-z]/i’,’message’=>’必須為字母’),
// 比對不是a-z array(‘username’, ‘match’, ‘allowEmpty’=>true, ‘not’=>true, ‘pattern’=>’/[a-z]/i’,’message’=>’必須不是字母’!我不會~~~但還是要微笑~~~:)
資料庫事務原子性,一緻性是怎樣實作的
這個問題的有趣之處,不在于問題本身(“原子性、一緻性的實作機制是什麼”),而在于回答者的分歧反映出來的另外一個問題:原子性和一緻性之間的關系是什麼?
我特别關注了@我練功發自真心
的答案,他正确地指出了,為了保證事務操作的原子性,必須實作基于日志的REDO/UNDO機制。但這個答案仍然是不完整的,因為原子性并不能夠完全保證一緻性。
按照我個人的了解,在事務處理的ACID屬性中,一緻性是最基本的屬性,其它的三個屬性都為了保證一緻性而存在的。
首先回顧一下一緻性的定義。所謂一緻性,指的是資料處于一種有意義的狀态,這種狀态是語義上的而不是文法上的。最常見的例子是轉帳。例如從帳戶A轉一筆錢到帳戶B上,如果帳戶A上的錢減少了,而帳戶B上的錢卻沒有增加,那麼我們認為此時資料處于不一緻的狀态。
資料庫實作的場景中,一緻性可以分為資料庫外部的一緻性和資料庫内部的一緻性。前者由外部應用的編碼來保證,即某個應用在執行轉帳的資料庫操作時,必須在
同一個事務内部調用對帳戶A和帳戶B的操作。如果在這個層次出現錯誤,這不是資料庫本身能夠解決的,也不屬于我們需要讨論的範圍。後者由資料庫來保證,即
在同一個事務内部的一組操作必須全部執行成功(或者全部失敗)。這就是事務處理的原子性。
為了實作原子性,需要通過日志:将所有對
資料的更新操作都寫入日志,如果一個事務中的一部分操作已經成功,但以後的操作,由于斷電/系統崩潰/其它的軟硬體錯誤而無法繼續,則通過回溯日志,将已
經執行成功的操作撤銷,進而達到“全部操作失敗”的目的。最常見的場景是,資料庫系統崩潰後重新開機,此時資料庫處于不一緻的狀态,必須先執行一個crash
recovery的過程:讀取日志進行REDO(重演将所有已經執行成功但尚未寫入到磁盤的操作,保證持久性),再對所有到崩潰時尚未成功送出的事務進行
UNDO(撤銷所有執行了一部分但尚未送出的操作,保證原子性)。crash
recovery結束後,資料庫恢複到一緻性狀态,可以繼續被使用。
日志的管理和重演是資料庫實作中最複雜的部分之一。如果涉及到并行處理和分布式系統(日志的複制和重演是資料庫高可用性的基礎),會比上述場景還要複雜得多。
但是,原子性并不能完全保證一緻性。在多個事務并行進行的情況下,即使保證了每一個事務的原子性,仍然可能導緻資料不一緻的結果。例如,事務1需要将100元轉入帳号A:先讀取帳号A的值,然後在這個值上加上100。但是,在這兩個操作之間,另一個事務2修改了帳号A的值,為它增加了100元。那麼最後的結果應該是A增加了200元。但事實上,
事務1最終完成後,帳号A隻增加了100元,因為事務2的修改結果被事務1覆寫掉了。
為了保證并發情況下的一緻性,引入了隔離性,即保證每一個事務能夠看到的資料總是一緻的,就好象其它并發事務并不存在一樣。用術語來說,就是多個事務并發執行後的狀态,和它們串行執行後的狀态是等價的。怎樣實作隔離性,已經有很多人回答過了,原則上無非是兩種類型的鎖:
種是悲觀鎖,即目前事務将所有涉及操作的對象加鎖,操作完成後釋放給其它對象使用。為了盡可能提高性能,發明了各種粒度(資料庫級/表級/行級……)/各
種性質(共享鎖/排他鎖/共享意向鎖/排他意向鎖/共享排他意向鎖……)的鎖。為了解決死鎖問題,又發明了兩階段鎖協定/死鎖檢測等一系列的技術。
一種是樂觀鎖,即不同的事務可以同時看到同一對象(一般是資料行)的不同曆史版本。如果有兩個事務同時修改了同一資料行,那麼在較晚的事務送出時進行沖突
檢測。實作也有兩種,一種是通過日志UNDO的方式來擷取資料行的曆史版本,一種是簡單地在記憶體中儲存同一資料行的多個曆史版本,通過時間戳來區分。
鎖也是資料庫實作中最複雜的部分之一。同樣,如果涉及到分布式系統(分布式鎖和兩階段送出是分布式事務的基礎),會比上述場景還要複雜得多。
我練功發自真心
提到,其他回答者說的其實是作業系統對atomic的了解,即并發控制。我不能完全同意這一點。資料庫有自己的并發控制和鎖問題,雖然在原理上和作業系統
中的概念非常類似,但是并不是同一個層次上的東西。資料庫中的鎖,在粒度/類型/實作方式上和作業系統中的鎖都完全不同。作業系統中的鎖,在資料庫實作中
稱為latch(一般譯為闩)。其他回答者回答的其實是“在并行事務處理的情況下怎樣保證資料的一緻性”。
最後回到原來的問題(“原子性、一緻性的實作機制是什麼”)。我手頭有本Database
System
Concepts(4ed,有點老了),在第15章的開頭簡明地介紹了ACID的概念及其關系。如果你想從概念上了解其實作,把這本書的相關章節讀完應該能大概明白。如果你想從實踐上了解其實作,可以找innodb這樣的開源引擎的源代碼來讀。不過,即使是一個非常粗糙的開源實作(不考慮太複雜的并行處理,不考慮分布式系統,不考慮針對作業系統和硬體的優化之類),要基本搞明白恐怕也不是一兩年的事。