热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【二十二】mysqli事务处理与预处理总结

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

事务基本原理

  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语句

 1 php
2 $mysqli=new mysqli("127.0.0.1","root","","test");
3 if (!$mysqli->connect_error) {
4 echo $mysqli->connect_error;
5 }
6 //预处理及绑定
7 $sql="INSERT INTO user1 (name,Password,Email,age)VALUES ( ?,?,?,?);";
8 //prepare 准备执行的sql语句
9 $sql_stmt=$mysqli->prepare($sql) or die($mysqli->error);
10 //参数绑定
11 //bind_param:将变量作为参数绑定到预处理语句
12 //这里的类型和顺序要对应
13 $sql_stmt->bind_param('sssi',$name,$Password,$Email,$age);
14 // 设置参数并执行
15 $name='sunwukong';
16 $Password='123';
17 $Email='sunwukong@qq.com';
18 $age='200';
19 //执行准备好的sql
20 $b=$sql_stmt->execute();
21 //添加第二个
22 $name='zhubajie';
23 $Password='123';
24 $Email='zhubajie@qq.com';
25 $age='200';
26 $b=$sql_stmt->execute();
27 //判断是否插入成功
28 if (!$b) {
29 echo "操作失败".$sql_stmt->error;
30 }else{
31 echo "操作成功";
32 }
33 //释放
34 $mysqli->close();
35 ?>

预处理dql语句

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

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

19 ?> 

在学习中遇到的问题

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


推荐阅读
  • 利用Cookie实现用户登录状态的持久化
    本文探讨了如何使用Cookie技术在Web应用中实现用户登录状态的持久化,包括Cookie的基本概念、优势及主要操作方法,并通过一个简单的Java Web项目示例展示了具体实现过程。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • SQL 数据恢复技巧:利用快照实现高效恢复
    本文详细介绍了如何在 SQL 中通过数据库快照实现数据恢复,包括快照的创建、使用及恢复过程,旨在帮助读者深入了解这一技术并有效应用于实际场景。 ... [详细]
  • 深入解析mt_allocator内存分配器(二):多线程与单线程场景下的实现
    本文详细介绍了mt_allocator内存分配器在多线程和单线程环境下的实现机制。该分配器以2的幂次方字节为单位分配内存,支持灵活的配置和高效的性能。文章分为内存池特性描述、内存池实现、单线程内存池实现、内存池策略类实现及多线程内存池实现等部分,深入探讨了内存池的初始化、内存分配与回收的具体实现。 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
  • 深入解析 RuntimeClass 及多容器运行时应用
    本文旨在探讨RuntimeClass的起源、功能及其在多容器运行时环境中的实际应用。通过详细的案例分析,帮助读者理解如何在Kubernetes集群中高效管理不同类型的容器运行时。 ... [详细]
  • 解决远程桌面连接时的身份验证错误问题
    本文介绍了如何解决在尝试远程访问服务器时遇到的身份验证错误,特别是当系统提示‘要求的函数不受支持’时的具体解决步骤。通过调整Windows注册表设置,您可以轻松解决这一常见问题。 ... [详细]
  • 最新进展:作为最接近官方声明的信息源,本文吸引了大量关注。若需获取最新动态,请访问:lkhill.com/ccie-version-5-update ... [详细]
  • Hadoop集群搭建:实现SSH无密码登录
    本文介绍了如何在CentOS 7 64位操作系统环境下配置Hadoop集群中的SSH无密码登录,包括环境准备、用户创建、密钥生成及配置等步骤。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • 工作中频繁在不同Linux服务器之间切换时,频繁输入密码不仅耗时还影响效率。本文介绍如何通过设置SSH密钥认证,简化登录流程,提高工作效率。 ... [详细]
  • Redis: 高效的键值存储系统
    Redis是一款遵循BSD许可的开源高性能键值存储系统,它不仅支持多种数据类型的存储,还提供了数据持久化和复制等功能,显著区别于其他键值缓存解决方案。 ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • 深入解析Java并发之ArrayBlockingQueue
    本文详细探讨了ArrayBlockingQueue,这是一种基于数组实现的阻塞队列。ArrayBlockingQueue在初始化时需要指定容量,因此它是一个有界的阻塞队列。文章不仅介绍了其基本概念和数据结构,还深入分析了其源码实现,包括各种入队、出队、获取元素和删除元素的方法。 ... [详细]
author-avatar
蔡晓楠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有