加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL数据库深入理解MySQL中的事务机制

发布时间:2020-12-12 02:58:47 所属栏目:MySql教程 来源:网络整理
导读:《MYSQL数据库深入理解MySQL中的事务机制》要点: 本文介绍了MYSQL数据库深入理解MySQL中的事务机制,希望对您有用。如果有疑问,可以联系我们。 ?使用数据库事务可以确保除事务性单元内的所有操作都成功完成.MySQL中的InnoDB引擎的表才支持transaction.在一

《MYSQL数据库深入理解MySQL中的事务机制》要点:
本文介绍了MYSQL数据库深入理解MySQL中的事务机制,希望对您有用。如果有疑问,可以联系我们。

?使用数据库事务可以确保除事务性单元内的所有操作都成功完成.MySQL中的InnoDB引擎的表才支持transaction.在一个事务里,如果出现一个数据库操作失败了,事务内的所有操作将被回滚,数据库将会回到事务前的初始状态.有一些不能被回滚的语句:将在本文的最后讨论.MYSQL实例

在一个web应用中,会很经常遇到必要使用事务的地方,要么希望若干语句都执行成功,要么都不执行,如果出现有些执行成功,而其他的失败将会导致数据损坏.MYSQL实例

在这篇文章的例子中,我们使用下面的两张表"employee"和"telephone",下面是SQL语句(作为参考):MYSQL实例

创建 employee表:
?
MYSQL实例

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中插入数据
?
MYSQL实例

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',6800),('Eliza',4750),('Nancy','Newman',5100),('Melinda','Project Manager',8500),('Harley','Gilbert',8000);

创建telephone表
?
MYSQL实例

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表插入数据
?
MYSQL实例

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

MYSQL实例

??? 设想你必要一个新的叫做Grace Williams雇员,并带有他的电话号码信息.你可能会执行下面两句sql:?
?
MYSQL实例

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

让我们看看第二个语句,在第一个语句中,employee_id是在第一条语句中指定的,设想一下,当第一条语句失败,而第二条语句成功的状况.在这种状况下,telephone表中就会有一条employee_id为9的记录,而employee表中并没有id为9的记录,而如果将这两个语句放在MySQL事务中,如果第一条语句失败,那么第二条语句也将回滚,从而不会造成这种问题.MYSQL实例

在PHP(PHP参考文档)中我们可以使用如下的方式启用事务:
?
MYSQL实例

<?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`,$salary)";
$query2 = "INSERT INTO `telephone` (`id`,'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回滚事务.MYSQL实例

所以,事务可以在某种程度上赞助我们维护数据的完整和正确,另外,为了保证数据无误,我们还推荐使用外键.MYSQL实例

并不是所有的语句都是支持事务的,例如,如果使用CREATE TABLE或者ALTER TABLE语句,必要了解更多可以参考MySQL手册查看哪些语句不能回滚.
MYSQL实例

编程之家培训学院每天发布《MYSQL数据库深入理解MySQL中的事务机制》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读