事务处理

事务基本原理

  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. web.xml中<init-param>报错

    报错信息如下图: 控制台报错:严重: Servlet /*** threw load() exceptionjava.lang.ClassNotFoundException: MyApplicatio ...

  2. 树莓派链接WiFi设置

    树莓派摆脱网线的束缚 在看这篇文章之前,请确保自己树莓派OS已经正常安装且已经连接网线,然后准备一个无线网卡,开始实现我们的树莓派摆脱网线的束缚吧 ! -_- 一.    安装网卡驱动 1.      ...

  3. Here We Go(relians) Again

    Here We Go(relians) Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...

  4. 楼梯T-SQL:超越基础6级:使用CASE表达式和IIF函数

     从他的楼梯到T-SQL DML,Gregory Larsen涵盖了更多的高级方面的T-SQL语言,如子查询. 有时您需要编写一个可以根据另一个表达式的评估返回不同的TSQL表达式的单个TSQL语句. ...

  5. 0_Simple__simpleCallback

    学习回调函数的基本概念,并在CUDA的任务流中插入基于CPU的主机函数,作为回调函数使用. ▶ 源代码:没有用到的部分被注释起来了 /*multithreading.h*/ #ifndef MULTI ...

  6. Android 开发笔记___EditText__文本编辑框

    常用属性: inputType:(代码中:setiputtype)设置输入类型,多种类型中间用"|" maxlength:最大长度,无法通过代码设置 hint:提示文本内容,(代码 ...

  7. 常用meta整理[转载]

    < meta > 元素 概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他web ...

  8. Python基础-变量定义-输出输入

    一.变量的定义 字母.数字.下划线组成,不能以数字开头,同时区分大小写 二.输出 print() print(,) 输出空格 input() 读取键盘输入

  9. php图片上传服务器

    原理是把图片上传到服务器的某个目录,然后在把他的名字存入数据库,或者不需要数据库这部分也行.读取的时候直接读取名字. HTML提交表格 <form method="post" ...

  10. (11.13)Java小知识!

    今天想要与大家分享一下有关于构造方法的知识! 构造方法的定义与作用 构造方法是一种特殊类型的方法.当一个对象被创建的时候,构造方法用来初始化对象,也就是说构造方法其实是一个名词而不是动词,像我刚刚开始 ...