首页 > 技术分享 > MySQL
收藏

细说MySQL事务

06/02 11:42
大潇博客 原创文章,转载请标明出处

今天抽时间看了下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表示当前默认存储引擎

如图所示:

msyql存储引擎.png

如何修改存储引擎

测试了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; (只针对本次连接生效)

查询事务提交状态.png


开启事务:

begin;


随机修改一条random记录:

update test set random = 666 order by rand() limit 1;


查询当前的数据:

select * from test;


回滚:rollback;

提交:commit;


全部流程参考下图:

事件rollback流程.png


commit情况:

事务commit情况.png


有的人会好奇,也确实会存在的情况,如果一个事务一直没有commit并且也没有rollback会怎样?

我没有进行真实测试,查询资料,大家给出的最多答案是:

1、断开链接会自动rollback

2、死锁或者这个锁超时的时候,也会rollback

时间充足的时候,我会进行验证


PHP中分别对应的函数为(面向过程)

mysqli_autocommit()   //打开或关闭本次数据库连接的自动命令提交事务模式

mysqli_begin_transaction()   //开启事务

mysqli_commit()   //提交一个事务

mysqli_rollback()   //回退当前事务


面向过程风格:

mysql事务PHP面向过程风格.png


举例,面向对象风格:

mysql事务PHP面向对象风格.png


打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311