加入收藏 | 设为首页 | 会员中心 | 我要投稿 鹤壁站长网 (https://www.0392zz.cn/)- 分布式云、存储数据、视频终端、媒体处理、内容创作!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL事务处理使用说明

发布时间:2022-06-18 08:37:24 所属栏目:MySql教程 来源:互联网
导读:事务处理是大型应用像银行,支付宝宝这类应用可能会用到的,就是当我们数据处理不成功能时要把数据清除回滚,下面我来介绍mysql事务处理的实例,各位朋友可参考. MYSQL的事务处理主要有两种方法. 1、用begin,rollback,commit来实现 begin 开始一个事务,rollback
  事务处理是大型应用像银行,支付宝宝这类应用可能会用到的,就是当我们数据处理不成功能时要把数据清除回滚,下面我来介绍mysql事务处理的实例,各位朋友可参考.
 
  MYSQL的事务处理主要有两种方法.
 
  1、用begin,rollback,commit来实现
 
  begin 开始一个事务,rollback 事务回滚,commit 事务确认
 
  2、直接用set来改变mysql的自动提交模式
 
  MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行,我们可以通过.
 
  set autocommit=0 禁止自动提交
 
  set autocommit=1 开启自动提交
 
  来实现事务的处理,当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束.
 
  注意当你结束这个事务的同时也开启了个新的事务,按第一种方法只将当前的作为一个事务.
 
  只有InnoDB支持事务,事务 ACID Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
 
  1、事务的原子性:一组事务,要么成功,要么撤回.
 
  2、稳定性:有非法数据,外键约束之类,事务撤回.
 
  3、隔离性:事务独立运行,一个事务处理后的结果,影响了其他事务,那么其他事务会撤回.事务的100%隔离,需要牺牲速度.
 
  4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改,可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里.
 
  开启事务:START TRANSACTION 或 BEGIN
 
  提交事务,关闭事务:COMMIT
 
  放弃事务,关闭事务:ROLLBACK
 
  折返点:SAVEPOINT adqoo_1,ROLLBACK TO SAVEPOINT adqoo_1
 
  发生在折返点 adqoo_1 之前的事务被提交,之后的被忽略.
 
  事务的终止,设置"自动提交"模式
 
  SET AUTOCOMMIT = 0
 
  每条SQL都是同一个事务的不同命令,之间由 COMMIT 或 ROLLBACK隔开
 
  掉线后,没有 COMMIT 的事务都被放弃.
 
  事务锁定模式
 
  系统默认:不需要等待某事务结束,可直接查询到结果,但不能再进行修改、删除.
 
  缺点:查询到的结果,可能是已经过期的.
 
  优点:不需要等待某事务结束,可直接查询到结果.
 
  需要用以下模式来设定锁定模式:
 
  1、SELECT …… LOCK IN SHARE MODE(共享锁)
 
  查询到的数据,就是数据库在这一时刻的数据,其他已commit事务的结果,已经反应到这里了.
 
  SELECT 必须等待,某个事务结束后才能执行.
 
  2、SELECT …… FOR UPDATE(排它锁)
 
  例如 SELECT * FROM tablename WHERE id<200,那么id<200的数据,被查询到的数据,都将不能再进行修改、删除、SELECT …… LOCK IN SHARE MODE操作一直到此事务结束
 
  共享锁 和 排它锁的区别:在于是否阻断其他客户发出的 SELECT …… LOCK IN SHARE MODE命令.
 
  3、INSERT / UPDATE / DELETE
 
  所有关联数据都会被锁定,加上排它锁.
 
  4、防插入锁
 
  例如 SELECT * FROM tablename WHERE id>200,那么id>200的记录无法被插入
 
  5、死锁
 
  自动识别死锁,先进来的进程被执行,后来的进程收到出错消息,并按ROLLBACK方式回滚
 
  innodb_lock_wait_timeout = n 来设置最长等待时间,默认是50秒
 
  事务隔离模式:
 
  SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL
 
  READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE
 
  1、不带SESSION、GLOBAL的SET命令
 
  只对下一个事务有效
 
  2、SET SESSION
 
  为当前会话设置隔离模式
 
  3、SET GLOBAL
 
  为以后新建的所有MYSQL连接设置隔离模式(当前连接不包括在内)
 
  隔离模式:READ UNCOMMITTED
 
  不隔离SELECT,其他事务未完成的修改(未COMMIT),其结果也考虑在内
 
  READ COMMITTED
 
  把其他事务的 COMMIT 修改考虑在内,同一个事务中,同一 SELECT 可能返回不同结果.
 
  REPEATABLE READ(默认)
 
  不把其他事务的修改考虑在内,无论其他事务是否用COMMIT命令提交过,同一个事务中,同一 SELECT 返回同一结果,前提是本事务,不修改.
 
  SERIALIZABLE,和REPEATABLE READ类似,给所有的SELECT都加上了 共享锁,一般MYSQL数据库默认的引擎是MyISAM,这种引擎不支持事务,如果要让MYSQL支持事务,可以自己手动修改.
 
  方法如下:1.修改c:/appserv/mysql/my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件.
 
  2.在运行中输入:services.msc,重启mysql服务。
 
  3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like 'have_%'; ),查看InnoDB为YES,即表示数据库支持InnoDB了,也就说明支持事务transaction了.
 
  4.在创建表时,就可以为Storage Engine选择InnoDB引擎了,如果是以前创建的表,可以使用mysql->alter table table_name type=InnoDB;
 
  或 mysql->alter table table_name engine=InnoDB;来改变数据表的引擎以支持事务.
 
  原理,代码如下:
 
  function Tran( $sql ) {
           $judge = 1;
           mysql_query('begin');
           foreach ($sql as $v) {
                   if ( !mysql_query($v) ) {
                           $judge = 0;
                   }
           }
           if ($judge == 0) {
                   mysql_query('rollback');
                   return false;
           }
           elseif ($judge == 1) {
                   mysql_query('commit');
                   return true;
           }
  }
  例,代码如下:
 
  <?php
  $handler=mysql_connect("localhost","root","");
  mysql_select_db("task");
  mysql_query("SET AUTOCOMMIT=0");//设置为不自动提交,因为MYSQL默认立即执行
  mysql_query("BEGIN");//开始事务定义
  if(!mysql_query("insert into trans (id) values('2')"))
  {
  mysql_query("ROOLBACK");//判断当执行失败时回滚
  }
  if(!mysql_query("insert into trans (id) values('4')"))
  {
  mysql_query("ROOLBACK");//判断执行失败回滚
  }  //phpfensi.com
  mysql_query("COMMIT");//执行事务
  mysql_close($handler);
  ?>

(编辑:鹤壁站长网)

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

    推荐文章
      热点阅读