事务处理

事务基本原理

  1. 如果不开启事务,执行一条sql,马上会持久化数据。可见:默认的mysql对sql语句的执行是自动提交的!
  2. 如果开启了事务,就是关闭了自动提交的功能,改成了commit执行自动提交

  自动提交的特征是保存在服务器的一个叫做autocommit的一个变量内。使用set 变量名=变量值的形式就可以完成修改(set autocommit=0;),此时就关闭了自动提交功能,需要手动执行commit让数据持久化

事务的特点(acid)

  • 原子性(atomicity)- 要不成功,要不失败。如果成功就必须完全应用到数据库,如果失败则不对数据库有任何影响
  • 一致性(consistency)- 是指一个事务执行之前和执行之后都处于一致性状态
  • 隔离性(lsolation)- 多个事务之间的隔离关系
  • 持久性(durability)- 一旦提交就不可能在被回滚

事务的操作

  1. 回滚(rollback)
  2. 提交(commit)
  3. 开始事务(begin、start transaction)

事物的语法

  • 开启事务(start transation;)
  • 做保存点(savepoint a;)
  • 执行操作
  • 回滚(rollback to a;)
  • 提交(commit)

mysqli操作数据(面向对象风格)

<?php
//数据库:create table account(id int primary key,balance float);
//银行转账
$mysqli=new MySQLi("localhost",'root','','test');
if ($mysqli->connect_error) {
echo $mysqli->connect_error;
}
//将提交设为假
$mysqli->autocommit(FALSE);
$sql1="update account22 set balance=balance+2 where id='1';";
$sql2="update account1 set balance=balance-2 where id='2';";
$a=$mysqli->query($sql1);
$b=$mysqli->query($sql2);
//判断语句是否为真
if (!$a || !$b) {
//其中有一个不成功即回滚不提交
echo "失败回滚".$mysqli->error;
$mysqli->rollback();
}else{
//所有均成功则提交
echo "成功";
$mysqli->commit();
}
$mysqli->close();
?>

在学习这个知识点所遇到的问题:代码没问题,在执行事务的时候,rollback不生效。

原因:我的数据库及表不是INNODB和BDB类型的(MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其它类型是不支持的!)

解决方法:将数据库及表修改为INNODB类型。修改方法参照:http://aiezu.com/article/83.html

预处理

预处理的好处

  • 效率高,执行速度快
  • 安全性高,可以防止sql注入

示例:

预处理dml语句

 <?php
$mysqli=new mysqli("127.0.0.1","root","","test");
if (!$mysqli->connect_error) {
echo $mysqli->connect_error;
}
//预处理及绑定
$sql="INSERT INTO user1 (name,Password,Email,age)VALUES ( ?,?,?,?);";
//prepare 准备执行的sql语句
$sql_stmt=$mysqli->prepare($sql) or die($mysqli->error);
//参数绑定
//bind_param:将变量作为参数绑定到预处理语句
//这里的类型和顺序要对应
$sql_stmt->bind_param('sssi',$name,$Password,$Email,$age);
// 设置参数并执行
$name='sunwukong';
$Password='123';
$Email='sunwukong@qq.com';
$age='200';
//执行准备好的sql
$b=$sql_stmt->execute();
//添加第二个
$name='zhubajie';
$Password='123';
$Email='zhubajie@qq.com';
$age='200';
$b=$sql_stmt->execute();
//判断是否插入成功
if (!$b) {
echo "操作失败".$sql_stmt->error;
}else{
echo "操作成功";
}
//释放
$mysqli->close();
?>

预处理dql语句

  <?php
$mysqli=new mysqli("127.0.0.1","root","","test");
if (!$mysqli->connect_error) {
echo $mysqli->connect_error;
}
//1.预处理及绑定
//2.参数设置
//3.执行
$sql="select name from user1 where id>?";
$stmt=$mysqli->prepare($sql) or die($mysqli->error) ;
$id=3;
$stmt->bind_param("i",$id);
//bind_result:将变量绑定到预先准备好的语句以获得结果存储
$stmt->bind_result($name);
$stmt->execute();
while ($stmt->fetch()) {
echo $name."<br/>";
}

    $stmt->free_result();
    $stmt->close();

 ?> 

在学习中遇到的问题

1.(预处理dql语句)执行语句的时候一直提示“Fatal error: Call to a member function bind_param() on boolean in D:\wamp64\www\shiwu2.php on line 12”,一直在绑定参数哪里找问题。

原因:sql语句写错了。解决方案:在执行sql的时候判断语句是否执行错误并打印错误信息

2.(预处理dql语句)第九行与第12行的参数要对应-name

【二十二】mysqli事务处理的更多相关文章

  1. [分享] IT天空的二十二条军规

    Una 发表于 2014-9-19 20:25:06 https://www.itsk.com/thread-335975-1-1.html IT天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...

  2. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  3. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

  4. 二十二、OGNL的一些其他操作

    二十二.OGNL的一些其他操作 投影 ?判断满足条件 动作类代码: ^ $   public class Demo2Action extends ActionSupport {     public ...

  5. WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]

    原文:WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇] 在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常.在服务执行过 ...

  6. VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池

    VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...

  7. Bootstrap入门(二十二)组件16:列表组

    Bootstrap入门(二十二)组件16:列表组 列表组是灵活又强大的组件,不仅能用于显示一组简单的元素,还能用于复杂的定制的内容. 1.默认样式列表组 2.加入徽章 3.链接 4.禁用的列表组 5. ...

  8. JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

    JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中 ...

  9. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

  10. 二十二. Python基础(22)--继承

    二十二. Python基础(22)--继承 ● 知识框架   ● 继承关系中self的指向 当一个对象调用一个方法时,这个方法的self形参会指向这个对象 class A:     def get(s ...

随机推荐

  1. phalcon——Paginator分页

    phalcon使用的分页器是Phalcon\Paginator. 首先先展示一个比较完整的使用例子: 控制器代码: use Phalcon\Paginator\Adapter\Model as Pag ...

  2. LeetCode 572. Subtree of Another Tree (是否是另一个树的子树)

    Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and no ...

  3. LeetCode 461. Hamming Distance (汉明距离)

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  4. 我只是想获取access_token而已

    起因是想在微信小程序中获取access_token. 之前资源只有一个阿里云虚拟主机和一个域名,于是用C#后端写了GET请求的接口,准备调用自己域名下的接口获取access_token 使用微信的wx ...

  5. [译]ASP.NET Core 2.0 路由引擎

    问题 ASP.NET Core 2.0的路由引擎是如何工作的? 答案 创建一个空项目,为Startup类添加MVC服务和请求中间件: public void ConfigureServices(ISe ...

  6. ssh免密码记录

    主机器A通过ssh连多台从机器(b1,b2,b3). 1.使用root用户操作,避免权限问题. 2.在主从机器中安装ssh,命令: ssh-keygen –t rsa 然后都回车,生成的文件在/roo ...

  7. 利用VS2008发布一个简单的webservice

    一个开发好的webservice,怎样发布出去,供其他电脑访问呢? 本文将介绍如何发布一个简单的webservice,其中的内容都是在网上查看别人文章,自己仿照着做了一遍,因此,难免会发生错误,如果发 ...

  8. 状压DP小结

    看了一个多星期状压DP,总算有点明白,大概可以分为两种:数据是在矩阵中的,数据是线性的,在矩阵中的一般就是排兵布阵这一种的,还有一种线性结构中给定条件让你求最大权值,比如求最大权值路线,TSP问题等, ...

  9. 网络拓展知识 ACL NAT IPv6

    第1章 ACL 访问控制列表 访问控制表(”位代表精确匹配,而“1“位代表不许匹配. 例如路由器EIGRP的配置中: RouterA(config)#router eigrp 100 RouterA( ...

  10. Jimmychoo商城系统总结

    一.需求 1.游戏模块 ①在进入H5之前,首先有一个动态的探照灯的动效,然后由"淡出"效果到H5首页. ②在点击"开始游戏"之后会有一段动画演示游戏内容,然后滑 ...