MySql协议讲解

MySql协议讲解-事务协议篇

MySql事务协议主要是通过set autocommit、commit以及rollback这三个报文(命令)来实现的。

MySql事务协议交互图

事务交互

1.Client向DB发送set autocommit命令

autocommit,顾名思义,是否自动提交(事务)。如果设置为1,表明自动提交,设置为0,则是非自动提交,这样就隐式的开启了事务。
值得注意的是,一但运行了set autocommit这个命令,不管设置为1或者0,都会自动提交前一个事务。 当然了如果之前autocommit=0然后set autocommit=0这样相当于状态没改,所以不会提交前一个事务。

MySql的set variable命令

此命令通常是用来设置局部/全局变量用。也是一种com_query包,如下图所示: autocommit
##2.DB向Client返回Okay包 Okay包已经在之前的博客中讲述过,在此不再赘述。 ##3.Client向DB发送SQL语句 SQL语句即是Com_query包,如果是insert、update或者delete则返回okay包。在此的okay包比起前面的包多了一些信息,下面进行详解。

insert、update或者delete

okay包会返回影响的行数

insert、update或者delete在执行后,都会返回影响的行数。这是通过在okay包中的affectedRows返回。

1public class OkPacket extends MySQLPacket{ 2 ...... 3 public long affectedRows; 4 public long insertId; 5 ...... 6}

last insert id

在insert执行后,OkPacket在其中的insertId返回last insert id,但是有些ORM框架(例如MyBatis)是通过select LAST_INSERT_ID()方法来获取的。
由于这个Id是存在mysql的session里面的,只要这个session没有被多线程复用,就不用担心last_insert_id被覆盖的问题。

select

SQL语句是select的话,则会返回ResultSet报文,这个在上一篇报文中已经讨论过。

重复上述过程

在一个事务内可以重复上述过程,知道有commit报文或者rollback报文被发送为止。

Commit/Rollback报文

Commit/Rollback报文也是一种com_query报文,如下图所示: commit_rollback
Commit报文发送后,DB进行事务提交,并返回okay报文。
Rollback报文发送后,DB进行事务回滚,并返回okay报文。

GitHub链接

https://github.com/alchemystar/Lancelot.git

原文链接

https://my.oschina.net/alchemystar/blog/837731

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0

MySQL数据库InnoDB存储引擎Log漫游(1)

作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,