程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 深刻懂得MySQL中的事務機制

深刻懂得MySQL中的事務機制

編輯:MySQL綜合教程

深刻懂得MySQL中的事務機制。本站提示廣大學習愛好者:(深刻懂得MySQL中的事務機制)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻懂得MySQL中的事務機制正文


 應用數據庫事務可以確保除事務性單位內的一切操作都勝利完成。MySQL中的InnoDB引擎的表才支撐transaction。在一個事務裡,假如湧現一個數據庫操作掉敗了,事務內的一切操作將被回滾,數據庫將會回到事務前的初始狀況。有一些不克不及被回滾的語句:將在本文的最初評論辯論。

在一個web運用中,會很常常碰到須要應用事務的處所,要末願望若干語句都履行勝利,要末都不履行,假如湧現有些履行勝利,而其他的掉敗將會招致數據破壞。

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

創立 employee表:
 

CREATE TABLE `employee` (
 `id` int NOT NULL AUTO_INCREMENT,
 `first_name` varchar(100) NOT NULL,
 `last_name` varchar(100) NOT NULL,
 `job_title` varchar(100) DEFAULT NULL,
 `salary` double DEFAULT NULL,
 `notes` text,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

向employee中拔出數據
 

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

創立telephone表
 

CREATE TABLE `telephone` (
 `id` int NOT NULL AUTO_INCREMENT,
 `employee_id` int DEFAULT NULL,
 `type` varchar(20) NOT NULL,
 `no` varchar(50) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

向telephone表拔出數據
 

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

https://www.aspphp.online/shujuku/UploadFiles_3118/201707/2017072814351816.jpg (447×584)

    假想你須要一個新的叫做Grace Williams雇員,並帶有他的德律風號碼信息。你能夠會履行上面兩句sql: 
 

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

讓我們看看第二個語句,在第一個語句中,employee_id是在第一條語句中指定的,假想一下,當第一條語句掉敗,而第二條語句勝利的狀態。在這類狀態下,telephone表中就會有一條employee_id為9的記載,而employee表中並沒有id為9的記載,而假如將這兩個語句放在MySQL事務中,假如第一條語句掉敗,那末第二條語句也將回滾,從而不會形成這類成績。

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

<?php
 
//$salary = 5000;
$salary = '$5000';
 
/* Change database details according to your database */
$dbConnection = mysqli_connect('localhost', 'robin', 'robin123', 'company_db');
 
mysqli_autocommit($dbConnection, false);
 
$flag = true;
 
$query1 = "INSERT INTO `employee` (`id`, `first_name`, `last_name`, `job_title`, `salary`) VALUES (9, 'Grace', 'Williams', 'Softwaree Engineer', $salary)";
$query2 = "INSERT INTO `telephone` (`id`, `employee_id`, `type`, `no`) VALUES (13, 9, 'mobile', '270-598712')";
 
$result = mysqli_query($dbConnection, $query1);
 
if (!$result) {
  $flag = false;
  echo "Error details: " . mysqli_error($dbConnection) . ". ";
}
 
$result = mysqli_query($dbConnection, $query2);
 
if (!$result) {
  $flag = false;
  echo "Error details: " . mysqli_error($dbConnection) . ". ";
}
 
if ($flag) {
 
  mysqli_commit($dbConnection);
  echo "All queries were executed successfully";
 
} else {
 
  mysqli_rollback($dbConnection);
  echo "All queries were rolled back"; 
 
}
 
mysqli_close($dbConnection);
 
?>


    當你履行mysqli_query函數的時刻,成果被立刻提交到了數據庫。應用mysqli_autocommit函數,可以封閉主動提交,履行成果只要當你想提交的時刻才提交。
    假如任何語句履行掉敗我們都可以設置$flag變量為false。假如有許多語句要履行,可以斟酌將他們放在for輪回中。
    最初,假如flag是true(也就是沒有毛病產生),我們應用mysqli_commit提交事務。不然我們應用mysqli_rollback回滾事務。

所以,事務可以在某種水平上贊助我們保護數據的完全和准確,別的,為了包管數據無誤,我們還推舉應用外鍵。

其實不是一切的語句都是支撐事務的,例如,假如應用CREATE TABLE或許ALTER TABLE語句,須要懂得更多可以參考MySQL手冊檢查哪些語句不克不及回滾。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved