资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

mysql事务怎么提交的 mysql事务提交了还能回滚吗

mysql 事务自动手动提交模式

默认情况下, MySQL启用自动提交模式(变量autocommit为ON)

创新互联建站于2013年开始,先为多伦等服务建站,多伦等地企业,进行企业商务咨询服务。为多伦企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果都没加,默认是session。

全局变量作用域:服务器每次启动将为所有的全局变量赋初始值,修改全局变量针对于所有的会话(连接)有效,但不能跨重启(重启服务器全局变量恢复为默认值)。

会话变量作用域:仅仅针对于当前会话(连接)有效

查询会话事务提交模式:

show session variables like 'autocommit';

查询全局事务提交模式:

show global variables like 'autocommit';

Value的值为ON,表示autocommit开启。OFF表示autocommit关闭。

set global autocommit=0;

set SESSION autocommit=0;

禁止自动提交

SET AUTOCOMMIT=0

开启自动提交:

SET AUTOCOMMIT=1

查询 正在执行的事务:

SELECT * FROM information_schema.INNODB_TRX

查看正在锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

查看等待锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

结束正在执行的事务:

使用mysql命令杀掉线程:kill 线程id (trx_mysql_thread_id)

手动提交模式:

BEGIN;

SQL;

COMMIT;

mysql commit过程详述

MySQL通过内部两阶段提交协议来提交事务,如下图

具体实现如下图:

第一阶段 :InnoDB prepare,持有prepare_commit_mutex,并且write/sync redo log;将rollback设置为Prepared状态,binlog prepare不作任何操作;

第二阶段 :包含两步,write/sync Binlog及 InnoDB commit (写入COMMIT标记后释放prepare_commit_mutex);

考虑mysql以binlog的写入与否作为事务提交成功与否的标志,如果 在写入innodb commit标志时崩溃(binglog已经写文件但是还没有提交) ,则恢复时,会重新对commit标志进行写入;此时的事务崩溃恢复过程如下:

1)扫描最后一个Binlog文件,提取其中的xid;

2)InnoDB维持了状态为Prepare的事务链表,将这些事务的xid和Binlog中记录的xid做比较,如果在Binlog中存在,则提交,否则回滚事务。

但其中也会存在2个问题:

并发危机:全局大锁prepare_commit_mutex

Mysql5.6.5前的做法,加锁,串行化

无锁方案:如果能保证binlog write 和  Innodb commit的顺序一致性就可以解决该问题。

性能问题:参数sync_binlog =1 ,innodb_flush_log_at_trx_commit =1时,fsync操作频繁

数据持久化到磁盘:调用fsync将缓存中的数据刷新到磁盘(普通硬盘150次/s和SSD 1200次/S),影响TPS;Group Commit操作,在多个事务并发时,将等待fsync的多个事务合并为仅调用一次fsync操作,以解决innodb fsync的问题,对binlog 的fsync也适用

对上述两个问题的解决:

针对并发问题

Group操作,三个阶段都在维护一个队列。第一个进队列的线程称为leader线程,负责对队列里所有线程进行操作;之后进入队列的线程称作follower线程,follower 线程进入队列后睡眠,等待leader完成操作后将他们唤醒。注意:前一个队列leader进入后一个队列时,会把自己原队列的follower全加入进去。

针对一致性问题 

Group commit 分为三个阶段,每个阶段有一个线程在执行。分阶段的目的在于各个阶段可以并发执行,提升效率。

涉及参数说明:

sync_binlog =1 :启用group commit之后,其实已经不是一个事务去刷一次磁盘了,而是一组事务刷一次磁盘。图中1、2分别代表sync_binlog 不同配置下,通知其他线程(如dump线程)binlog 已经更新了,当配置为1时,要严格等到sync完毕之后才会发送广播通知, 如果sync_binlog配的是别的值,MySQL会把通知提前到1的位置

binlog_group_commit_sync_no_delay_count(组提交sync无延迟时间最大event数)及binlog_group_commit_sync_delay(组提交sync延迟时间,单位:毫秒):一般来说我们认为group commit 中最耗时的操作是sync阶段,于是我们可以在sync阶段在leader真正sync之前进行一个等待,以便让fsync一次性刷新更多的事务。这对需要等待sync 完之后才能进行的操作(比如dump线程)可能有性能提升。

两阶段提交:

MYSQL_BIN_LOG作为协调者

mysql 事务之基本用法与手动提交

提交一个事务示例

回滚一个事务示例

主要是看@@autocommit 值

提交一个事务示例

回滚一个事务示例

PHP 中mysql如何实现事务提交

事务就是指对数据库的多次修改,要么全部成功,要么全部失败,不能出现部分修改成功,部分修改失败的情况。

PHP下操作mysql数据库要实现事务提交,需注意以下方面:

1, 数据库表存储引擎类型设置为innoDB。默认的mysql表采用MYISAM引擎,是不支持事务的,因此要采用以下语句变更:

mysql alter table ‘table_name’ engine=innodb;

2,PDO对象设置要设置errmode为Exception,否则第16行SQL执行出错,语句也不会跳到catch段去rollback, 而是继续向下执行直到commit。


当前文章:mysql事务怎么提交的 mysql事务提交了还能回滚吗
转载源于:http://cdkjz.cn/article/doigdos.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220