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

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

  • 原子性(atomicity)- 要不成功,要不失败。如果成功就必须完全应用到数据库,如果失败则不对数据库有任何影响
  • 一致性(consistency)- 是指一个事务执行之前和执行之后都处于一致性状态
  • 隔离性(lsolation)- 多个事务之间的隔离关系
  • 持久性(durability)- 一旦提交就不可能在被回滚
  1. 回滚(rollback)
  2. 提交(commit)
  3. 开始事务(begin、start transaction)
  • 开启事务(start transation;)
  • 做保存点(savepoint a;)
  • 执行操作
  • 回滚(rollback to a;)
  • 提交(commit)
  1. <?php
  2. //数据库:create table account(id int primary key,balance float);
  3. //银行转账
  4. $mysqli=new MySQLi("localhost",'root','','test');
  5. if ($mysqli->connect_error) {
  6. echo $mysqli->connect_error;
  7. }
  8. //将提交设为假
  9. $mysqli->autocommit(FALSE);
  10. $sql1="update account22 set balance=balance+2 where id='1';";
  11. $sql2="update account1 set balance=balance-2 where id='2';";
  12. $a=$mysqli->query($sql1);
  13. $b=$mysqli->query($sql2);
  14. //判断语句是否为真
  15. if (!$a || !$b) {
  16. //其中有一个不成功即回滚不提交
  17. echo "失败回滚".$mysqli->error;
  18. $mysqli->rollback();
  19. }else{
  20. //所有均成功则提交
  21. echo "成功";
  22. $mysqli->commit();
  23. }
  24. $mysqli->close();
  25. ?>

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

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

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

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

示例:

预处理dml语句

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

预处理dql语句

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

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

  1. 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

版权声明:本文为8013-cmf原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.cnblogs.com/8013-cmf/p/8000565.html