今天抽时间看了下MySQL的事务,网上有很多官方说法,这里就不说那些废话,简单明了的总结下事务。
本文全部为自我理解总结,有不当之处请留言指出。前半段为讲解,后半段是案例。
什么时候使用MySQL事务:
我的理解,任何情况下的sql语句,都使用了事务,只不过大部分为自动提交,我们这里重点说,事务的手动提交。
这里我把事务列为三步,事务开始->执行SQL->事务结束
可以这样理解:开启事务,数据操作进入虚拟表,然后可用 rollback 撤销,也可使用 commit 真实提交
开始事务语句:
begin;
或者
start transaction;
中间可以执行多条SQL语句,dml、dql等都可以
事务结束语句:
手动提交:
commit; //执行此语句,上面的所有SQL结果全部正式生效,不可以再返回后退
事务回滚:
rollback; //执行此语句,上面的所有SQL结果全部无效,等于反悔还原
若遇到MySQL中事务不回滚或其它失效情况,请查看并修改当前MySQL的存储引擎,MyISAM存储引擎不支持事务处理,InnoDB是较新的事务安全型存储引擎,支持特性多,更支持事务处理,建议使用InnoDB存储引擎
如何查看当前数据库的存储引擎:
show engines;
YES表示支持该存储引擎
DEFAULT表示当前默认存储引擎
如图所示:
如何修改存储引擎
测试了SQL方式修改,很多情况会导致修改不生效,若没有特殊的存储引擎要求,可以在配置文件my.ini中的 [mysqld] 下面加入
default-storage-engine=INNODB
直接进行修改
下面举例事务的应用
首先创建数据表:
CREATE TABLE `test` (
`id` int primary key auto_increment NOT NULL,
`random` int NOT NULL
) ENGINE=INNODB;
添加若干条数据:
INSERT INTO test(id,random) values (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1);
将random修改为随机数:
update test set random = FLOOR(7 + (RAND() * 6));
查询当前的事务是否为自动提交:
show variables like 'autocommit';
若值为“ON”,则修改状态:
set autocommit=0; (只针对本次连接生效)
开启事务:
begin;
随机修改一条random记录:
update test set random = 666 order by rand() limit 1;
查询当前的数据:
select * from test;
回滚:rollback;
提交:commit;
全部流程参考下图:
commit情况:
有的人会好奇,也确实会存在的情况,如果一个事务一直没有commit并且也没有rollback会怎样?
我没有进行真实测试,查询资料,大家给出的最多答案是:
1、断开链接会自动rollback
2、死锁或者这个锁超时的时候,也会rollback
时间充足的时候,我会进行验证
PHP中分别对应的函数为(面向过程)
mysqli_autocommit() //打开或关闭本次数据库连接的自动命令提交事务模式
mysqli_begin_transaction() //开启事务
mysqli_commit() //提交一个事务
mysqli_rollback() //回退当前事务
面向过程风格:
举例,面向对象风格: