国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

深入理解MySQL中的事務機制

2024-07-24 13:07:33
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了MySQL中的事務機制,事務機制在各大MySQL教程中均為重要知識,需要的朋友可以參考下

使用數據庫事務可以確保除事務性單元內的所有操作都成功完成。MySQL中的InnoDB引擎的表才支持transaction。在一個事務里,如果出現一個數據庫操作失敗了,事務內的所有操作將被回滾,數據庫將會回到事務前的初始狀態。有一些不能被回滾的語句:將在本文的最后討論。

在一個web應用中,會很經常遇到需要使用事務的地方,要么希望若干語句都執行成功,要么都不執行,如果出現有些執行成功,而其他的失敗將會導致數據損壞。

在這篇文章的例子中,我們使用下面的兩張表"employee"和"telephone",下面是SQL語句(作為參考):

創建 employee表:

 

 
  1. CREATE TABLE `employee` ( 
  2. `id` int NOT NULL AUTO_INCREMENT, 
  3. `first_name` varchar(100) NOT NULL, 
  4. `last_name` varchar(100) NOT NULL, 
  5. `job_title` varchar(100) DEFAULT NULL, 
  6. `salary` double DEFAULT NULL, 
  7. `notes` text, 
  8. PRIMARY KEY (`id`) 
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

向employee中插入數據

 

 
  1. INSERT INTO `employee` (`first_name`, `last_name`, `job_title`, `salary`) VALUES 
  2. ('Robin''Jackman''Software Engineer', 5500), 
  3. ('Taylor''Edward''Software Architect', 7200), 
  4. ('Vivian''Dickens''Database Administrator', 6000), 
  5. ('Harry''Clifford''Database Administrator', 6800), 
  6. ('Eliza''Clifford''Software Engineer', 4750), 
  7. ('Nancy''Newman''Software Engineer', 5100), 
  8. ('Melinda''Clifford''Project Manager', 8500), 
  9. ('Harley''Gilbert''Software Architect', 8000); 

創建telephone表

 

 
  1. CREATE TABLE `telephone` ( 
  2. `id` int NOT NULL AUTO_INCREMENT, 
  3. `employee_id` int DEFAULT NULL, 
  4. `type` varchar(20) NOT NULL, 
  5. `no` varchar(50) NOT NULL, 
  6. PRIMARY KEY (`id`) 
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

向telephone表插入數據

 

 
  1. INSERT INTO `telephone` (`employee_id`, `type`, `no`) VALUES 
  2. (1, 'mobile''245-249697'), 
  3. (2, 'mobile''270-235969'), 
  4. (2, 'land''325-888885'), 
  5. (3, 'mobile''270-684972'), 
  6. (4, 'mobile''245-782365'),  
  7. (4, 'land''325-888886'), 
  8. (5, 'mobile''245-537891'), 
  9. (6, 'mobile''270-359457'), 
  10. (7, 'mobile''245-436589'),  
  11. (7, 'land''325-888887'), 
  12. (8, 'mobile''245-279164'),  
  13. (8, 'land''325-888888'); 

深入理解MySQL中的事務機制

設想你需要一個新的叫做Grace Williams雇員,并帶有他的電話號碼信息。你可能會執行下面兩句sql:

 

 
  1. INSERT INTO `employee` (`id`, `first_name`, `last_name`, 
  2. `job_title`, `salary`) VALUES (9, 'Grace''Williams'
  3. 'Softwaree Engineer', 5000); 
  4.  
  5. INSERT INTO `telephone` (`id`, `employee_id`, `type`, 
  6. `no`) VALUES (13, 9, 'mobile''270-598712'); 

讓我們看看第二個語句,在第一個語句中,employee_id是在第一條語句中指定的,設想一下,當第一條語句失敗,而第二條語句成功的狀況。在這種狀況下,telephone表中就會有一條employee_id為9的記錄,而employee表中并沒有id為9的記錄,而如果將這兩個語句放在MySQL事務中,如果第一條語句失敗,那么第二條語句也將回滾,從而不會造成這種問題。

在PHP(PHP參考文檔)中我們可以使用如下的方式啟用事務:

 

 
  1. <?php 
  2.  
  3. //$salary = 5000; 
  4. $salary = '$5000'
  5.  
  6. /* Change database details according to your database */ 
  7. $dbConnection = mysqli_connect('localhost''robin''robin123''company_db'); 
  8.  
  9. mysqli_autocommit($dbConnection, false); 
  10.  
  11. $flag = true; 
  12.  
  13. $query1 = "INSERT INTO `employee` (`id`, `first_name`, `last_name`, `job_title`, `salary`) VALUES (9, 'Grace', 'Williams', 'Softwaree Engineer', $salary)"
  14. $query2 = "INSERT INTO `telephone` (`id`, `employee_id`, `type`, `no`) VALUES (13, 9, 'mobile', '270-598712')"
  15.  
  16. $result = mysqli_query($dbConnection$query1); 
  17.  
  18. if (!$result) { 
  19. $flag = false; 
  20. echo "Error details: " . mysqli_error($dbConnection) . ". "
  21.  
  22. $result = mysqli_query($dbConnection$query2); 
  23.  
  24. if (!$result) { 
  25. $flag = false; 
  26. echo "Error details: " . mysqli_error($dbConnection) . ". "
  27.  
  28. if ($flag) { 
  29.  
  30. mysqli_commit($dbConnection); 
  31. echo "All queries were executed successfully"
  32.  
  33. else { 
  34.  
  35. mysqli_rollback($dbConnection); 
  36. echo "All queries were rolled back";  
  37.  
  38.  
  39. mysqli_close($dbConnection); 
  40.  
  41. ?> 

當你執行mysqli_query函數的時候,結果被立即提交到了數據庫。使用mysqli_autocommit函數,可以關閉自動提交,執行結果只有當你想提交的時候才提交。

如果任何語句執行失敗我們都可以設置$flag變量為false。如果有很多語句要執行,可以考慮將他們放在for循環中。

最后,如果flag是true(也就是沒有錯誤發生),我們使用mysqli_commit提交事務。否則我們使用mysqli_rollback回滾事務。

所以,事務可以在某種程度上幫助我們維護數據的完整和正確,另外,為了保證數據無誤,我們還推薦使用外鍵。

并不是所有的語句都是支持事務的,例如,如果使用CREATE TABLE或者ALTER TABLE語句,需要了解更多可以參考MySQL手冊查看哪些語句不能回滾。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德安县| 汪清县| 平塘县| 宁武县| 奉节县| 沅江市| 婺源县| 武清区| 同心县| 阳朔县| 关岭| 平度市| 吴旗县| 山西省| 宝山区| 云霄县| 收藏| 永昌县| 尉犁县| 资兴市| 星子县| 涟源市| 久治县| 遂川县| 襄汾县| 秭归县| 襄樊市| 永善县| 汉沽区| 江阴市| 安吉县| 水城县| 渝北区| 化德县| 葫芦岛市| 缙云县| 蓬溪县| 开原市| 班玛县| 濮阳市| 宝坻区|