mysql事务

Python MySQL(MySQLdb)

可紊 提交于 2020-03-05 03:12:20
From: http://www.yiibai.com/python/python_mysql.html Python标准的数据库接口的Python DB-API(包括Python操作MySQL)。大多数Python数据库接口坚持这个标准。 Python标准的数据库接口的Python DB-API。大多数Python数据库接口坚持这个标准。. 你可以选择适合您应用的数据库。 Python 数据库API支持范围广泛的数据库服务器: GadFly mSQL MySQL PostgreSQL Microsoft SQL Server 2000 Informix Interbase Oracle Sybase 下面是可用的Python数据库接口的列表: Python Database Interfaces and APIs 你必须下载一个单独的DB API的模块,你需要访问的每个数据库。例如,如果你需要访问Oracle数据库以及MySQL数据库,你必须下载Oracle和MySQL数据库模块. DB API提供了与数据库的工作,尽可能使用Python的结构和语法的最低标准。这个API包括以下: 导入API模块. 获取与数据库的连接. 发出SQL语句和存储过程. 关闭连接 我们这里将仅学习使用MySQL的所有概念,所以让我们来谈谈MySQLdb模块. 什么是MySQLdb?

MySQL之架构与历史(二)

大憨熊 提交于 2020-03-03 23:08:15
多版本并发控制 MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。不仅是MySQL,包括Oracle、PostgreSQL等其他数据库系统也都实现了MVCC,但各自的实现机制不尽相同,因为MVCC没有一个统一的实习标准。 可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制不同,但大都实现了非阻塞的读操作,写操作也只锁定了必要的行。 MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。 前面说到不同存储引擎的MVCC实现是不同的,典型的有乐观(optimistic)并发控制和悲观(pessimistic)并发控制。下面我们通过InnoDB的简化版行为来说明MVCC是如何工作的。 InnoDB的MVVC,是通过在每行记录后面保存两个隐藏列来实现的。一个保存了行的创建时间,一个保存了行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number)。每开启一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为当前事务的版本号

MySQL 事务及事务的隔离级别

回眸只為那壹抹淺笑 提交于 2020-03-03 20:01:07
什么是事务 通过一组逻辑操作单元(一组DML——sql语句),将数据从一种状态切换到另外一种状态。 事务的特点(遵循ACID原则) 原子性(atomicity) :最小的执行单元。(要么全成功,有一条失败则回滚到最初状态)要么都执行,要么都回滚 一致性(consistrncy) :保证数据的状态操作前和操作后保持一致,即事务的执行使得数据库从一种正确状态转换为另一种正确的状态。 隔离性(isolation) :多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰 持久性(durability) :一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改 事务的作用 : 事务管理对于企业级应用而言至关重要,它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。就像银行的自动提款机ATM,通常ATM都可以正常为客户服务,但是也难免遇到操作过程中及其突然出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过ATM机一样,以保证用户和银行的利益都不受损失。 相关步骤: 1、开启事务 2、编写事务的一组逻辑操作单元(多条sql语句) 3、提交事务或回滚事务 事务控制语句 : begin/ start transaction:开启事务 commit:提交事务 rollback:回滚事务

MySQL存储引擎

喜你入骨 提交于 2020-03-03 16:51:16
MySQL5.5后,默认存储引擎是InnoDB,5.5之前默认是MyISAM。 InnoDB(事务性数据库引擎)和MyISAM的区别补充: InnoDB是聚集索引,数据结构是B+树,叶子节点存K-V,V存的是 数据页 。MyISAM是非聚集索引,V上存的是主键值,查到后还需要再聚集索引上再查一次。 InnoDB是具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。适合存在大量insert、update场景。 MyISAM强调的是性能,不支持事务,最大缺陷就是崩溃后无法安全恢复,更适合读密集的小型应用。 只有InnoDB支持MVCC(多版本控制)。应对高并发事务, MVCC比单纯的加锁更高效,所以InnoDB更适合高并发场景。 常用命令 //查所有引擎 mysql> show engines; //查当前引擎 mysql> show variables like '%storage_engine%'; 来源: https://www.cnblogs.com/ChengzhiYang/p/12402630.html

MySQL基础篇(05):逻辑架构图解和InnoDB存储引擎详解

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-03 07:56:25
本文源码: GitHub·点这里 || GitEE·点这里 一、MySQL逻辑架构 1、逻辑架构图 基于下面的逻辑架构图,可以大致熟悉MySQL各个架构组件之间的协同工作关系。 很经典的C/S架构风格,即客户端/服务端模式。 2、分层描述 客户端连接 通常会进行连接池管理,连接用户权限认证,安全管理等操作。 可以通过如下命令查看连接配置信息: SHOW VARIABLES LIKE '%connect%'; 可以看到最大连接和每个连接占用的内存等相关配置。 核心功能 第二层架构封装MySQL一系列核心操作,查询解析、优化、缓存、内置函数、触发器、视图等,跨存储引擎的功能都在这一层实现。 存储引擎 MySQL的最底层封装,也是最核心的功能,不同的存储引擎有不同的特点功能,共同点是处理数据的存储和提取。 二、概念简介 1、存储引擎 MySQL数据库存储引擎是数据库底层的架构组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还具有不同的特点功能,以满足不同场景下的业务需求。 2、支持关系 可以通过下面两个命令查看MySQL当前版本,和对存储引擎的支持情况。 SELECT VERSION() ; SHOW ENGINES ; 可以看出本地环境是MySQL5.7,支持如下几种存储引擎:

SpringAOP声明式事务控制:xml配置(spring提供的事务管理器)

痞子三分冷 提交于 2020-03-03 04:00:29
文章目录 1. 创建 spring 的配置文件并导入约束 2. 编写业务层,持久层 3. 在配置文件中配置业务层和持久层对 4. spring中基于XML的声明式事务控制配置步骤 1. 创建 spring 的配置文件并导入约束 此处需要导入 aop 和 tx 两个名称空间 < ? xml version = "1.0" encoding = "UTF-8" ? > < beans xmlns = "http://www.springframework.org/schema/beans" xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns : aop = "http://www.springframework.org/schema/aop" xmlns : tx = "http://www.springframework.org/schema/tx" xsi : schemaLocation = "http : / / www . springframework . org / schema / beans http : / / www . springframework . org / schema / beans / spring - beans . xsd http : / / www .

事务特性及隔离级别

喜你入骨 提交于 2020-03-03 00:16:26
一、事务特性 1. 原子性 事务的原子性即需保证事务是一个原子操作,要么全部成功一起提交,要么全部失败一起回滚,一个事务不可能之完成其中的一部分 2. 一致性 事务的一致性,即数据库总是从一个一致性状态转换到另一个一致性状态,即不论发生异常或者是机器故障等,事务若没有最终提交,事务中所已经执行语句也不会对数据库产生影响 3. 隔离性 一个事务提交成功之前所作的操作,对其他事务是不可见的 4. 持久性 一旦事务成功提交,其对数据库数据所做的修改就会永久保存到数据库中 二、隔离级别 1. 未提交读(READ UNCOMMITTED) 事务中所执行的操作,即使未提交,也对其他事务可见(事务可以读取其他事务未提交的事件,成为脏读) 2. 提交读(READ COMMITTED) 一个事务中,看不到其他事务未提交前的所做的修改,但其他事务一旦提交,本事务中就会对其修改可见。因此,当你在一个事务中执行相同的查询操作,可能会得到不同的查询结果(中间有修改所查数据的事务提交成功),称为不可重复读 3. 可重复读(REPEATABLE READ) 可重复读是mysql中默认的隔离级别,决解了脏读的问题,该级别保证一个事务中多次相同查询的结果不变。但又产生了新的问题“幻读”,即其他事务在本事务查询范围内又重新插入数据,此时就会产生幻读,即查询结果会多出新插入数据。Innodb通过mvcc决解了这个问题

数据库分库分表思路

怎甘沉沦 提交于 2020-03-02 15:35:22
一. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。 数据库分布式核心内容无非就是数据切分(Sharding) ,以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。 数据切分根据其切分类型,可以分为两种方式: 垂直(纵向)切分和水平(横向)切分 1、垂直(纵向)切分 垂直切分常见有垂直分库和垂直分表两种。 垂直分库 就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。如图: 垂直分表 是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销

深入理解MySQL底层实现

自古美人都是妖i 提交于 2020-03-02 13:01:12
本文摘自: http://harlon.org/2018/06/20/database/ 深入理解MySQL底层实现 这里选用MySQL作为了解数据库的底层实现,这是因为MySQL是目前最常用的数据库,了解它的底层实现也基本上对目前大数据的数据库所用的技术会有一个大致的了解。数据库最主要的索引设计,了解数据库的索引设计基本上就对数据库有了大致的了解,其次对其事务的ACID操作实现原理做以分析,以及数据库中所用到的提高其性能的优化等等。 存储引擎 MySQL常用的存储引擎有InnoDB和MyISAM,其中MyISAM是MySQL的默认存储引擎。 InnoDB InnoDB的存储文件有两个,后缀名分别是.frm和.idb,其中.frm是表的定义文件,而idb是数据文件。InnoDB中存在表锁和行锁,不过行锁是命中索引的情况下才会起作用的。 InnoDB支持事务,且支持四种隔离级别,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏

Spring声明式事务@Transactional 详解,事务隔离级别和传播行为

风流意气都作罢 提交于 2020-03-02 09:42:20
@Transactional注解支持9个属性的设置,这里只讲解其中使用较多的三个属性:readOnly、propagation、isolation。其中propagation属性用来枚举事务的传播行为,isolation用来设置事务隔离级别,readOnly进行读写事务控制。 @Service @Transactional(readOnly = true) public class AppTradeRec2Service extends BaseService { @Autowired private AppTradeRecDao appTradeRecDao; @Autowired private ConsInfoDao consInfoDao; @Transactional(readOnly = false) public void payCharge(TradeRec tradeRec) { User usr = UserUtils.getUser(); ConsInfo cons = consInfoDao.getByUser(usr.getId()); //修改交易记录 tradeRec.setPayBefore(cons.getAccountAmt()); tradeRec.setPayAfter(cons.getAccountAmt() - tradeRec