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结束。
注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
个人推荐使用第一种方法!

MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!
***:一般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;来改变数据表的引擎以支持事务。
以下是测试的实例代码


代码如下:

mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");
//若不使用事务,則$sql执行成功,$sql1执行失败
$sql = " insert into test values('11','88') ";
$sql1 = " insert into test values('11','88','444') ";
$res = mysql_query($sql);
$res1 = mysql_query($sql1);
//因为使用了事务,則兩個insert都执行失败
if($res && $res1){
mysql_query("COMMIT");
}
else{
mysql_query("ROLLBACK");
}
mysql_query("END");
mysql_query("SET AUTOCOMMIT=0"); //設置mysql不自動提交,需自行用commit語句提交
$sql = " insert into test values('11','88') ";
$sql1 = " insert into test values('11','88','444') ";
$res = mysql_query($sql);
$res1 = mysql_query($sql1);
//因为使用了事物,则两个insert都执行失败
if($res && $res1){
mysql_query("COMMIT");
}
else{
mysql_query("ROLLBACK");
}
mysql_query("END");

对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法:
代码如下:


代码如下:

//MyISAM & InnoDB 都支持,
//Notes:query语句不能写在一起如:mysql_query("select * from a;select * from b;");
$sql_1=" LOCK TABLES test WRITE ";
mysql_query($sql_1);
$sql_2=" INSERT INTO test VALUES('".$a."','".$b."') ";
if(mysql_query($sql_2)){
echo 'successful!';
}else{
echo 'Unsuccessful!';
}
$sql_3=" UNLOCK TABLES ";
mysql_query($sql_3);

(0)

相关推荐

  • php下pdo的mysql事务处理用法实例

    本文实例讲述了php下pdo的mysql事务处理用法.分享给大家供大家参考.具体分析如下: php+mysql事务处理的几个步骤: 1.关闭自动提交 2.开启事务处理 3.有异常就自动抛出异常提示再回滚 4.开启自动提交 注意:mysql只有这个InnoDB驱动是支持事务处理的,默认MyIsAM驱动不支持,下面是实例代码: 复制代码 代码如下: <?php     try{         $pdo=new pdo("mysql:host=localhost;dbname=mydb&quo

  • php实现mysql事务处理的方法

    本文实例讲述了php实现mysql事务处理的方法.分享给大家供大家参考.具体分析如下: 要实现本功能的条件是环境 mysql 5.2 /php 5 支持事务的table 类型,需要InnoDB,有了这些条件你就可以做上面的实现了,这个事物回滚操作是大项目经常用到的,像银行,电子商务等都会用到,有需要的朋友可以参考一下. 近期项目软件升级到支持事务处理,做个示例供大家学习参考. 环境 mysql 5.2 /php 5 支持事务的table 类型 需要InnoDB php mysql 事务处理实现程

  • MySQL事务处理与应用简析

    事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操作大都需要用到事务处理.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!删除的SQL语句delete from userinfo where ~~~delete from mail where ~~delete from article where~~~~如果没有事务处理,在你删除的过程中,假设出错了,只执行了第一

  • PHP+Mysql基于事务处理实现转账功能的方法

    本文实例讲述了PHP+Mysql基于事务处理实现转账功能的方法.分享给大家供大家参考.具体如下: <?php header("Content-Type:text/html;charset=utf-8"); $mysqli=new mysqli("localhost","root","","test"); if(mysqli_connect_errno()) { printf("连接失败:%s

  • mysql 锁表锁行语句分享(MySQL事务处理)

    复制代码 代码如下: mysql_query("set autocommit=0"); $list_one = $db->fetch_first("select * from prizes where id = ".$id." FOR UPDATE"); $db->query("DELETE from prizes WHERE id =".$list_one['id']); mysql_query("co

  • 为mysql数据库添加添加事务处理的方法

    语句如下:alter table tableName engine=InnoDB; 用到的表 复制代码 代码如下: CREATE TABLE IF NOT EXISTS `test` ( `id` int(10) NOT NULL auto_increment, `websitename` varchar(200) character set utf8 NOT NULL, `websiteurl` varchar(200) character set utf8 NOT NULL, PRIMARY

  • Mysql事务处理详解

    一.Mysql事务概念 MySQL 事务主要用于处理操作量大,复杂度高的数据.由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务.事务用来管理 insert,update,delete 语句. 二.事务特性:Atomicity(原子性).Consistency(稳定性,一致性).隔离性(Isolation)和Durability(持续性,可靠性).这四个特性也简称ACID性. 1.原子

  • 解析php mysql 事务处理回滚操作(附实例)

    很多新手在进行项目过程中,会碰到这样一种情况,如:论坛扣币项目中,用户支付论坛币的时候如果突然断网.电脑死机.停电.等其它自然灾害时,导致本次交易没有成功(即用户的币已经扣掉了,但是服务器数据库中没有消费记录等其它情况),这种情况应该怎么样进行处理呢? 在这个时候,我们可以用Mysql事务回滚来进行处理,那代码怎么写呢? 那下面我就来说一说这个mysql事务回滚应该怎么处理. 首先MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的! 那如果,我们的数据表已经存

  • mysql 事务处理及表锁定深入简析

    MYSQL的事务处理主要有两种方法. 1.用begin,rollback,commit来实现 begin 开始一个事务 rollback 事务回滚 commit 事务确认 2.直接用set来改变mysql的自动提交模式 MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过 set autocommit=0 禁止自动提交 set autocommit=1 开启自动提交 来实现事务的处理. 当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务

  • Mysql中FIND_IN_SET()和IN区别简析

    前段时间项目中使用到Mysql的FIND_IN_SET函数,感觉挺好用的.过一段时间,老大找到我说,这个需要改为IN,哈哈,只能改了,原因会在下面分析到! 弄个测试表来说说两者的区别,测试数据直接在问答区copy一份,能说明问题就行,哈哈,如果侵犯您的版权还请见谅,互联网吗,就需要分享! 测试代码: CREATE TABLE `test` ( `id` int(8) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `list` var

  • javascript实现自动填写表单实例简析

    本文实例讲述了javascript实现自动填写表单的方法.分享给大家供大家参考,具体如下: 在平时开发过程中,或者在访问某些站点,经常要频繁地填写一大堆表单时,我们可以利用javascript,写一段脚本,预先把要填的信息准备好,然后模拟点击按钮的动作,自动提交表单,轻松且高效. 步骤 1. 找到页面中对应的form,把form中所需的html控件列出来,如 <form name="customersForm" id="myform" method="

  • 简析mysql字符集导致恢复数据库报错问题

    mysql字符集编码错误的导入数据会提示错误了,这个和插入数据一样如果保存的数据与mysql编码不一样那么肯定会出现导入乱码或插入数据丢失的问题,下面我们一起来看一个例子. <script>ec(2);</script> 恢复数据库报错:由于字符集问题,最原始的数据库默认编码是latin1,新备份的数据库的编码是utf8,因此导致恢复错误. [root@hk byrd]# /usr/local/mysql/bin/mysql -uroot -p'admin' t4x < /t

  • Oracle的数据字典技术简析

    正在看的ORACLE教程是:Oracle的数据字典技术简析.数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的.比如一个表的创建者信息,创建时间信息,所属表空间信息,用户访问权限信息等.当用户在对数据库中的数据进行操作时遇到困难就可以访问数据字典来查看详细的信息. Oracle中的数据字典有静态和动态之分.静态数据字典主要是在用户访问数据字典时不会发生改变的,但动态数据字典是依赖数据库运行的性能的,反映数据库运行的一些内在信息,所以在访问这类数据字典时往往不是一成不变的.以下

  • 游戏和服备忘问题简析

    今天游戏和服,发现数据备份好后,导入不到目标库中, mysql -h10.66.125.733 --port 3306 -u sanda -pX12234455 --default-character-set=utf8 sanda_s10 < /data/mysql/8/user.sql 返回 ERROR 1044 (42000) at line 20: Access denied for user 'sanda'@'10.105.%' to database 'sanda_s10' 经查缺少了

  • mysql事务处理用法与实例代码详解

    MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关 1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB:支持ACID事务.行级锁.并发 3.Berkeley DB:支持事务 一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行.换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的.如果在事务的任何操作失败,则整个事务将失败. 实际上,会俱乐部许多SQL查询到一个组中,将执行所有的人都一起作为事务的一部分. 事务的特性: 事务有以下

  • MySQL中修改表结构时需要注意的一些地方

    MySql 在修改表结构的时候可能会中断产品的正常运行影响用户体验,甚至更坏的结果,丢失数据.不是所有的数据库管理员.程序员.系统管理员都非常了解Mysql能避免这种情况.DBA会经常碰到这种生产中断的情况,当升级脚本修改了应用层和数据库层,或者缺乏经验的管理员.开发在不是很了解Mysql内部工作机制的情况下修改了规范文件. 真相是: 直接修改表结构的过程中会锁表(在5.6版本之前) 在线的数据定义语言在5.6版本不总是在线的而且也会锁表 就算使用Percona工具包(在线修改定义文件)也会有若

随机推荐