1. 在一個批量操作的sql中,如果一個失敗,其他的會怎麼樣呢
2. 對於大資料表,線上更新而不影響使用者使用
3. 事務與鎖的關係
建立測試表member表
1. 在一個批量操作的sql中,如果一個失敗,其他的會怎麼樣呢
第一種情況:先看一下,多條語句沒有事務控制的程式碼
$conn = Yii::$app->db1; $sql1 = 'insert into member (name,password) values ("yang","vincent")';\t$sql2 = 'insert into member (name,password,gender) values ("yang","vincent1")';\t $conn->createCommand($sql1)->execute();\t $conn->createCommand($sql2)->execute();
執行結果怎麼呢 ,下面我們來看看,結果大家也猜得到,報錯了
SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row.....
欄位不匹配,但是,資料表第一條已經插入成功,只是第二條語句出錯了!
第二種情況:多條語句,有事務控制
測試程式碼如下:
$conn = Yii::$app->db1;\t\t$transaction = $conn->beginTransaction();\t\ttry {\t\t\t$sql1 = 'insert into member (name,password) values ("yang","vincent")';\t\t\t$sql2 = 'insert into member (name,password,gender) values ("yang","vincent1")';\t\t $conn->createCommand($sql1)->execute();\t\t $conn->createCommand($sql2)->execute();\t\t // ... executing other SQL statements ...\t\t $transaction->commit();\t\t} catch (Exception $e) {\t\t $transaction->rollBack();\t\t}
結果同樣出錯,錯誤資訊和第一種情況一致,但是這次資料表一條記錄也沒有,不難理解,我們都知道,在一個事務中,多個操作,要麼都失敗,要麼都成功。
第三種情況:一條語句,批量插入,有事務控制
測試程式碼如下:
$sql1 = 'insert into member (name,password) values ("yang","vincent"),("yang","lily",1)';\t\t $conn->createCommand($sql1)->execute();\t\t $transaction->commit();
執行程式碼出錯,錯誤和上面情況一致,資料表一條也沒有寫入成功,所以批量操作的sql語句是原子性的操作,相當於事務 控制。
總結:
在進行批量插入時,要麼都成功,要麼都失敗,比如:在一個有唯一性索引的表批量插入時,只要有一個重複,整個操作都會失敗,並不是部分成功,部分失敗,在實際開發中要注意!
2. 大資料表,如何做到線上更新而不影響使用者使用
我們的應用上線以後,功能在不停的迭代更新,資料表難免會修改,當資料量很大時,進行table更新,如修改表結構、增加欄位、修改欄位值、加索引,這些操作肯定會對使用者有影響的。
比如增加索引,一張表千萬數量級,可能會卡住幾十分鐘或長達幾個小時。
常用的方法是:
在測試環境測試修改的影響,如果是幾分鐘,可以直接線上修改,如果時間長則不行
選一個使用者使用最少的時間,停服更新;這應該是最常用的方法,這也是程式猿苦逼的原因,經常要熬夜功能上線。
業界的其他方案,也只有大公司能玩得轉:
fecebook自己開發的工具,地址
http://bazaar.launchpad.net/~mysqlatfacebook/mysqlatfacebook/tools/files/head:/osc
也是8年前的版本,沒有更新過了,只適用於mysql5.0,5.1 ,用php寫的腳步,有興趣的可以看一下,也許有借鑑意義;
像BAT這些大公司內部應該都有自己研發的工具,畢竟他們更有這些需求,技術大牛也多!
線上表結構的線上修改是一個業界難題!
3. 事務與鎖的關係
事務中會不會加鎖?
事務加不加鎖,和事務的隔離級別有關,隔離級別中的可重複讀和序列化,本身事務已經完全隔離了,所以事務內操作就沒必要加鎖了。
事務本身並不加鎖,加不加鎖取決於執行的語句,一旦加鎖直到事務提交或 回滾才會釋放。
事務的作用是什麼?
事務保證操作的完整性,如訂單和庫存的操作,但不保證資料的正確性,如 update goods set num=num-1 where goods_id=1,所以這樣不能保證超賣情況!還需要鎖機制。
鎖的作用是什麼?
鎖是避免併發的操作導致資料破壞,導致結果不是預期,常用在一些資料敏感的場合!