码迷,mamicode.com
首页 > 数据库 > 详细

mysql-进阶 事物

时间:2015-12-16 21:17:31      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

事物,说白了就是将多条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都能成功

 

mysql-进阶 事物

标签:

原文地址:http://www.cnblogs.com/gaofeifiy/p/5052250.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!