事物,说白了就是将多条sql语句绑定到一起,如果其中有一条不能执行就这些sql全部终止,使用它的典型就是涉及金钱转账方面的操作;
支持事物的有 InoDB,BDB和NDB
MyISAM不支持
查看所用mysql 支持数据库命令
show engines
修改表引擎
alter table xxx engine=innodb;
开启事物就要关闭mysql的自动提交
start transaction; 或者 begin;
关闭自动提交: set autocommit=0;
开启自动提交: set autocommit=1;
ps:
用start transaction; 和set autocommit=0; 的区别就是前者在发送commit命令后依然是自动提交 而后者需要手动开启
set autocommit、commit、begin、alter、create、rollback、等命令会自动提交事务
下面进行实际操作:
首先创建一张银行表
create table bank(
bid int unsigned primary key auto_increment,
name char(20) not null default ‘‘,
money decimal(6,2) unsigned not null default 0
);
插入两条信息
insert into bank (name,money) values (‘A先生‘,1000),(‘B先生‘,0);
开启事务(完整,成功的时候)
begin;
关闭自动提交
set autocommit=0;
先减去500
update bank set money=money-500 where bid=1;
加上500
update bank set money=money+500 where bid=2;
提交 回滚
commit;/rollback;
如果不成功,就将上面的 commit; 换成 rollback;回滚操作
在php中利用pdo进行操作演示
1 <?php 2 $dsn = "mysql:host=127.0.0.1;dbname=测试数据库名"; 3 try{ 4 //连接PDO 5 $pdo = new Pdo($dsn,‘root‘,‘‘); 6 //设置异常错误 7 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 8 //设置字符集 9 $pdo->query(‘SET NAMES UTF8‘); 10 //开启事务 11 $pdo->query("BEGIN"); 12 //关闭自动提交 13 $pdo->query("SET AUTOCOMMIT=0"); 14 //1.扣钱 15 $pdo->exec("UPDATE bank SET money=money-500 WHERE bid=1"); 16 //2.加钱 17 $pdo->exec("UPD1ATE bank SET money=money+500 WHERE bid=2"); 18 //提交 19 $pdo->query("COMMIT"); 20 21 }catch(PDOException $e){ 22 //如果有错误则回滚,撤销之前的操作 23 $pdo->query(‘ROLLBACK‘); 24 echo ‘<span style="color:red">‘ . $e->getMessage() . ‘</span>‘; 25 } 26 27 28 ?>
这样的话,当try括号中的sql命令出错的话就进行下面的回滚操作,保证这两条sql都能成功
原文:http://www.cnblogs.com/gaofeifiy/p/5052250.html