跟着百度学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命令。即可。