博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
事务浅析
阅读量:4948 次
发布时间:2019-06-11

本文共 1711 字,大约阅读时间需要 5 分钟。

Ⅰ、事务概述

  • 事务是一个程序的执行单元
  • 事务由一组sql组成(可以是1条或者多条)

tips:

一个事务可以有多条sql组成,tps是每秒的事务量,仅仅通过tps判断业务量高和低是不太准确的,如果事务里面sql比较多,即使tps比较低,那实际qps又是比较高的

Ⅱ、事务的特性

大家都知道事务的特性叫ACID,我们这把用很通俗的语言来描述这四个特性,具体实现后面再分析

  • A——atomicity(原子性)
    一个事务内所有sql操作是原子的,要么都做要么都不做

原子性由redo保证

  • C——consistency(一致性)
    事务前后状态保持一致,不破坏数据结构和约束

一致性由undo保证

  • I——isolation(隔离性)
    一个事务所做的修改对其他事务不可见,好似串行执行(和事务隔离级别是两个概念)

隔离性由lock保证

  • D——durable(持久性)
    一旦写了,数据不会丢失

持久性由redo和undo保证

Ⅲ、事务的类型

事务类型 说明
flat transactions 扁平事务,最常见的事务
flat transactions with savepoints 带保存点的事务
chained transactions 链事务,一个事务commit之后自动begin,没意义
nested transactions 嵌套事务,目前无数据库支持
distributed transactions 分布式环境下的扁平事务,每个节点支持acid,这是事务acid更高的标准
long transactions 运行时间非常长的事务,比如银行利息业务,这种事务会主从延迟,尽量拆成小事务(和online ddl用pt一样,不是为了加速,而是变慢达到降低主从延迟的目的)

tips:

  • 分布式事务案例:工行转账1w元到农行

    其实这个并不是用分布式事务做的,骗骗人的,所有银行网络打通?不存在的,后面详细讲这个问题

  • 主从延迟是mysql这几年面临的比较头疼的问题,主从复制的机制是用binlog来搞而不是像oracle那样用物理日志做

  • innodb除了嵌套事务其他都支持,myisam不支持事务

Ⅳ、事务操作

4.1 开启/关闭事务

法1:begin;xxx...;commit/rollback;法2:start transaction;xxx...;commit/rollback;为什么有第二种方法?因为begin在存储过程中是一个关键字,嘿嘿...
  • 一个好习惯

    1、不管做什么,先打个begin,安全,不打begin就会auto commit自动提交,oracle不会自动提交

    2、show variables like 'autocommit'; 默认值是1 这个设成0,这样再直接delete就可以rollback

4.2 另一个玩法

begin;aaasavepoint s1;   设置一个保存点bbbrollback to s1;  回滚到aaa,aaa还没提交这时候新开一个session,进去是看不到aaa的最后还要commit或者rollback,当然也可以继续执行其他操作再去commit或者rollback

4.3 线上常见问题一例

线上业务经常会碰到代码里没有commit,导致事务对应的所有的锁占用的资源都没有释放,导致其他线程使用到对应资源都没办法提交

如何发现?

show processlist;满足如下4个条件:

1、用户是开发的账号2、Command为sleep3、Time非常大4、Info为NULL

tips:

  • 线上sleep的线程很多没问题,但是这个time并不会很高

  • 通常我们用的都是线程池自动维护线程的活跃,每隔一段时间会维护一次(发个select 1来保持连通性,所以这个time应该和维护周期是一致的),发现不对劲我们可以手动kill掉这些进程

  • select * from information_schema.innodb_trx\G也可以看,不过上面那种更方便

转载于:https://www.cnblogs.com/---wunian/p/9062342.html

你可能感兴趣的文章
3529: [Sdoi2014]数表 - BZOJ
查看>>
自我介绍
查看>>
字符串匹配算法综述
查看>>
Linux centosVMware shell 管道符和作业控制、shell变量、环境变量配置文件
查看>>
在程序被送入后台时,向 iOS 借点时间,来完成一个长期任务
查看>>
【设计模式】工厂模式
查看>>
两个表格中数据不用是一一对应关系--来筛选不同数据,或者相同数据
查看>>
前端之路
查看>>
javascript 继承
查看>>
String类型转int类型方法
查看>>
关于渲染引擎设计,Scene Management的文章
查看>>
oracle 使用leading, use_nl, rownum调优
查看>>
客户数据库出现大量cache buffer chains latch
查看>>
Linux文件权限
查看>>
機械の総合病院 [MISSION LEVEL: C]
查看>>
Delphi通用的序列化代码
查看>>
Educational Codeforces Round 6 D. Professor GukiZ and Two Arrays 二分
查看>>
设计模式:职责链模式(Chain Of Responsibility)
查看>>
stm32f429i disc usb cdc vcp 虚拟串口 example project (CubeMX Hal)
查看>>
Robust PCA via Outlier Pursuit
查看>>