可我浪费着我寒冷的年华

跟着百度学PHP[14]-PDO之Mysql的事务处理1

  事务处理:在实际案例当中干一件事的mysql语句(好比转账,小一同学转账100,小二同学收账,在mysql当中小一就要减去转账的钱,小二就要增加100快)倘若该语句执行过程中有任何一条的sql语句出错那么就将该件事情的sql语句全部撤销。这就叫事务处理。

mysql中常用的表类型有两种:

  1.mylsam 非事务  特点:增删改速度快

  2.InnodB  事务型  特点:安全性高

mysql默认的是mylsanm,所以我们使用mysql的事务处理就需要将默认的改为InnodB类型。

我们先来创建一个innodb类型的表。

mysql> create table demo(
    -> id int not null auto_increment primary key,
    -> username char(50),
    -> yue double)
    -> engine=innodb; //将引擎设置为innodb,engine英译为:引擎
Query OK, 0 rows affected (0.20 sec)

此时我插入两条数据:(PS:此时还没有进行开启自动提交,所以数据不会自动提交。)

mysql> insert into demo(id,username,yue) values(1,'zhangsan',100);
Query OK, 1 row affected (0.00 sec)

mysql> insert into demo(id,username,yue) values(2,'lisi',120);
Query OK, 1 row affected (0.00 sec)

在mysql默认当中执行sql语句是自动提交的,比如insert into demo(id,username,yue) values(1,"admin",1000);执行了以后就直接自动提交。我们要进行事务处理就需要做以下步骤

1.先将自动提交给关闭

mysql> set autocommit=0; //auto英译为自动,commit英译为提交、推送。0为关闭,1为开启。
Query OK, 0 rows affected (0.00 sec)

2.开启事物处理

mysql> start transaction; //trasaction英译为处理。
Query OK, 0 rows affected (0.00 sec)

如此便OK了。

假设我们现在zhangsan同学用余额转账转了十块钱给李四然后,那么就会执行两条sql语句,一条是将张三同学的余额减掉十元钱,第二个是将李四余额加十元。

mysql> update demo set yue = 90 where username = 'zhangsan';
Query OK, 1 row affected (0.08 sec)
Rows matched: 1  Changed: 1  Warnings: 0

将设此时因为系统错误,李四没有收到张三转账的十元。那么就可以使用rollback进行撤回。

mysql> select * from demo;
+----+----------+------+
| id | username | yue  |
+----+----------+------+
|  1 | zhangsan |  100 |
|  2 | lisi     |  120 |
+----+----------+------+
2 rows in set (0.00 sec)

mysql> update demo set yue = 90 where username = 'zhangsan';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from demo;
+----+----------+------+
| id | username | yue  |
+----+----------+------+
|  1 | zhangsan |   90 |
|  2 | lisi     |  120 |
+----+----------+------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.05 sec)

mysql> select * from demo;
+----+----------+------+
| id | username | yue  |
+----+----------+------+
|  1 | zhangsan |  100 |
|  2 | lisi     |  120 |
+----+----------+------+
2 rows in set (0.00 sec)

在没有使用commit提交之前都是可撤回的。因为数据并没有提交。

如果要提交就用commit命令。即可。

 

posted @ 2017-02-21 22:28  珍惜少年时  阅读(295)  评论(0编辑  收藏  举报
可我浪费着我寒冷的年华