事务浅析

Ⅰ、事务概述

  • 事务是一个程序的执行单元
  • 事务由一组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;
aaa
savepoint s1;   设置一个保存点
bbb
rollback to s1;  回滚到aaa,aaa还没提交
这时候新开一个session,进去是看不到aaa的
最后还要commit或者rollback,当然也可以继续执行其他操作再去commit或者rollback

4.3 线上常见问题一例

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

如何发现?

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

1、用户是开发的账号
2、Command为sleep
3、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

时间: 2024-08-29 21:49:50

事务浅析的相关文章

分布式系统事务 浅析

谈谈本人结合实际,对分布式系统事务的应用与理解.     我们在架构系统时,通常会做N层,分层的意义在于系统结构更清晰,易于维护,易于扩展等.我将拿四层结构举例,谈谈对分布式系统事务的实际应用.     首先,系统四层做如下定义:模型层,数据层,业务层,服务层.     然后,阐述四层的意义:               模型层:作为ORM的Object,不作详细说明               数据层:访问具体DB,实现SQL执行               业务层:实现简单,独立业务    

h2database源码浅析:事务、两阶段提交

http://blog.csdn.net/bluejoe2000/article/details/42437633 h2database源码浅析:事务.两阶段提交 2015-01-05 22:54 734人阅读 评论(0) 收藏 举报  分类: 源码故事(18)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Transaction Isolation Transaction isolation is provided for all data manipulation

SQL Server事务遭遇网络异常时的处理机制浅析

SQL Server数据库中,如果应用程序正在执行一个事务的时候突然遭遇了网络异常,例如网络掉包,网络中断等,那么这个事务会怎么样? SQL Server数据库是通过什么机制来判断处理呢? 估计很多人跟我一样都有不少疑问, 我们下面构造一个测试实验来测试验证一下.如下所示: 步骤1:在客户端连使用SSMS工具连接到测试数据库,执行下面脚本,显性事务既不提交也不回滚.模拟事务正在执行当中. USE AdventureWorks2012; GO SELECT @@SPID; BEGIN TRAN D

[数据库事务与锁]详解二: 数据库的读现象浅析

注明: 本文转载自http://www.hollischuang.com/archives/900 “读现象”是多个事务并发执行时,在读取数据方面可能碰到的状况.先了解它们有助于理解各隔离级别的含义.其中包括脏读.不可重复读和幻读. 脏读 脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的. 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交(commit)到

【Oracle】浅析Oracle中的事务

1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行. 如:网上转帐就是典型的要用事务来处理,用以保证数据的一致性. 2. 事务特性 SQL92标准定义了数据库事务的四个特点: 原子性(Atomicity):一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做. 一致性(Consistency):事务开始时,数据库中的数

Spring事务传播特性的浅析——事务方法嵌套调用的迷茫

Spring事务传播机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷. 其实这是不认识Spring事务传播机制而造成的误解,Spring对事务控制的支持统一在TransactionDefinition类中描述,该类有以下几个重要的接口方法: int getPropagationBehavior():事务的传播行为 int getIsolationLevel():事务的隔离级别

Oracle 浅析Oracle中的事务

1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行. 如:网上转帐就是典型的要用事务来处理,用以保证数据的一致性. 2. 事务特性 SQL92标准定义了数据库事务的四个特点: 原子性(Atomicity):一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做. 一致性(Consistency):事务开始时,数据库中的数

浅析数据库事务中的故障恢复

简介 保证数据的一致性是数据库的一个最最基本的功能,那数据库在机器down机或者出现其他意外的情况下是如何去保证数据库的数据的一致性的呢?数据库本身主要依靠undolog和redolog两种日志文件去保持数据的一致性,本文将围绕undolog进行介绍.如何利用undolog去实现数据库的一致性. 数据库架构简介 要介绍数据库一致性的实现机制,自然少不了要介绍下数据库的整体架构,这里画一个简图来介绍下数据库的架构.(因为数据库的架构不是本文重点,所以这里就画个简图,想要详细了解数据库架构的,可以再

浅析postgresql数据库事务及行锁特征

开源数据库领域,postgresql以其优越的性能.功能及良好的稳定性排名首位可谓当之无愧,尤其是对高并发的支持可谓匠心独具.而优越的性能和稳定性,究其根本无非是良好的基础架构,本文将对其性能和稳定性有着良好支撑的事务及锁机制进行探讨,并结合实际测试,以真切说明和证明其特点. 1.可在事务中的DDL postgresql中,DDL语句可以在事务中,既可以提交,也可以回滚,这在实际工作中,不然具备很大的实际意义,也会给工作带来方便和安全,如下图所示: 2.mvcc postgresql中,很好的实