A. php mysql commit之后还可以rollback么
事务(transaction)是由查询和/或更新语句的序列组成。 用 begin、start transaction
开始一个事务,rollback 回滚事务,commit 提交事务。 在开始一个事务后,可以有若干个 SQL 查询或更新语句,每个 SQL
递交执行后,还应该有判断是否正确执行的语句,以确定下一步是否回滚,若都被正确执行则最后提交事务。
事务一旦回滚,数据库则保持开始事务前状态。就好象一个被编辑的文件不存盘退出,自然还是保持文件原来的样子。
所以,事务可被视为原子操作,事务中的 SQL,要么全部执行,要不一句都不执行。
人家的回答,编辑文件可以理解吧
B. php 开启mysql事务,会自动提交么
您好,MySQL提交方式autocommit默认开启,这种模式本身就是以每次查询为一次单独的事务。
当开启事务后,直到执行commit语句才会提交,所以不会自动提交,否则我们开启事务也没有意义了呀。
希望能帮到您。
C. 关于Thinkphp 事务处理 mysql 插入获取ID的问题。
$sql_exist="select * from ".C('blog_info')." where title='$title'"; $count1 =$Info_obj->execute($sql_exist); if(empty($count1)){ $checkadmin=new Model; import('Think.Util.Input'); //调用当前Session值。 $adminuser=trim(Session::get(C('USER_AUTH_NAME'))); //echo $adminuser; //echo lll; date_default_timezone_set("PRC"); $act_time=date("Y-m-d H:i:s"); $sql="insert into ".C('blog_info')." set title='$title',content='$content'"; //李盯$id=mysql_insert_id(); $action="哪猛和添加了id为".$id."的记录"; $in_log="insert into ".C('blog_log')." set adser='$adminuser'知脊,action='".$action."',act_time='$act_time'"; $count =$Info_obj->execute($sql); $count2=$Info_obj->execute($in_log); if(!empty($count)&&!empty($count2)){ //$s_log =$Info_obj->query($sql_log); $Info_obj->commit(); return $count;} else{ $Info_obj->rollback; return 3; } //return $s_log; }else{ return 3; } 用mysql_insert_id();是在第一条数据执行之后生成的, 事务处理时 两条sql是同时进行。 这样就获取不到ID值。
D. php mysql 事务怎么写
去官方文档 其实就是开启事务 绑定事物 回滚或者通过 提交事物
E. 谈谈你对 mysql 事务的认识 我是php初学者不懂这个 想请教大神教我
先族或简单介绍一下事务吧!事务是DBMS得执行单位。它由有限得数据库操作序列组成得。但不是任意得数据库操作序列都能成为事务。一般来说,事务是必须满足4个条件(ACID)
原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,就是说不允许事务部分得执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库得影响!
一致性(Consistency):事务得操作应该使使数据库从一个一致状态转变倒另兆州伍一个一致得状态!就拿网上购物来说吧,你只有即让商品出库,又让商品进入顾客得购物篮才能构成事务!
隔离性(Isolation):如果多个事务并发执行,应象各个事务独立执迹灶行一样!
持久性(Durability):一个成功执行得事务对数据库得作用是持久得,即使数据库应故障出错,也应该能够恢复!
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的数据表的锁定和解锁!
MYSQL5.0 WINXP下测试通过~ ^_^
mysql> use test;
Database
changed
mysql> CREATE TABLE `dbtest`(
-> id int(4)
-> ) TYPE=INNODB;
Query OK, 0 rows affected, 1 warning (0.05
sec)
mysql> select * from dbtest
-> ;
Empty set (0.01
sec)
mysql> begin;
Query OK, 0 rows affected (0.00
sec)
mysql> insert into dbtest value(5);
Query OK, 1 row affected
(0.00 sec)
mysql> insert into dbtest value(6);
Query OK, 1 row
affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00
sec)
mysql> select * from dbtest;
+------+
| id
|
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.00
sec)
mysql> begin;
Query OK, 0 rows affected (0.00
sec)
mysql> insert into dbtest values(7);
Query OK, 1 row affected
(0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00
sec)
mysql> select * from dbtest;
+------+
| id
|
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.00
sec)
mysql>
*******************************************************************************************************************
[PHP]
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]
************************************************
<?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");//判断执行失败回滚
}
mysql_query("COMMIT");//执行事务
mysql_close($handler);
?>
引自:http://www.cnblogs.com/in-loading/archive/2012/02/21/2361702.html
F. php 面试必考题 mysql的MyISAM 和 InnoDB 的区别
1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from
table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含
where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。MyISAM 是表所
innodb是行锁
5.LOAD TABLE FROM MASTER(从主负载表)操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update
table set num=1 where name like “"2%”
6.InnoDB 支持事物
选择存储引擎 根据实际情况选择。
一般情况下如果查询多建议使用myIsam 。
如果你需要事务处理或是外键,那么InnoDB 可能是比较好的方式。
优化MYSQL数据库的方法:
1,选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM
2,使用join代替子查询
3,使用联合(UNION)来代替手动创建的临时表
4,事务处理(保证数据完整性,例如添加和修改同时,两者成立则都执行,一者失败都失败)
5,适当建立索引(如何建立索引?索引的利与弊?)
6,优化sql语句
7,explain可以看到mysql执行计划
8,分表(垂直分表,水平分表?)
9,数据库主从
G. php mysql事务能解决什么问题
1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
H. php mysql 事务怎么写
mysql_query("begin");
mysql_query("commit");
mysql_query("rollback"改伏旅厅耐);
mysql_query("核凳end");
直接这样写就可以了
I. php mysql 事务无法回滚 rollback不起作用
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理,其他的类型是不支持的.
你可以检查下你的数据库用的什么引擎