事务管理

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:回滚事务

JDBC数据库事务管理

倖福魔咒の 提交于 2020-03-03 18:57:50
JDBC控制事务 使用Connection对象来管理事务 开启事务 :setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即可开启事务 提交事务:commit() 回滚事务: rollback 转账案例 package cn . itcats ; import cn . Utils . JDBCutils ; import java . sql . Connection ; import java . sql . PreparedStatement ; import java . sql . SQLException ; /** * JDBC控制事务 * 1.使用Connection对象来管理事务 * 开启事务 :setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即可开启事务 * 提交事务:commit() * 回滚事务: rollback * 转账案例 * */ public class JDBCdemo07 { public static void main ( String [ ] args ) { Connection conn = null ; PreparedStatement pre1 = null ; PreparedStatement pre2 = null ;

JDBC事务

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-03 09:15:37
如果JDBC连接处于自动提交模式,默认情况下,则每个SQL语句在完成后都会提交到数据库。 对于简单的应用程序可能没有问题,但是有三个原因需要考虑是否关闭自动提交并管理自己的事务 - 提高性能 保持业务流程的完整性 使用分布式事务 事务能够控制何时更改提交并应用于数据库。 它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,整个事务将失败。 要启用手动事务支持,而不是使用JDBC驱动程序默认使用的自动提交模式,请调用 Connection 对象的 setAutoCommit() 方法。 如果将布尔的 false 传递给 setAutoCommit() ,则关闭自动提交。 也可以传递一个布尔值 true 来重新打开它。 例如,如果有一个名为 conn 的 Connection 对象,请将以下代码关闭自动提交 - conn.setAutoCommit(false); Java 提交和回滚 完成更改后,若要提交更改,那么可在连接对象上调用 commit() 方法,如下所示: conn.commit( ); Java 否则,要使用连接名为 conn 的数据库回滚更新,请使用以下代码 - conn.rollback( ); Java 以下示例说明了如何使用提交和回滚对象 - try{ //Assume a valid connection object conn conn

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,支持如下几种存储引擎:

Java原理 事务的ACID是指什么?

拥有回忆 提交于 2020-03-02 16:41:42
Java原理 事务的ACID是指什么? 一、什么是Java事务 通常的观念认为,事务仅与数据库相关。 事务必须服从ISO/IEC所制定的ACID原则。 ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。 原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。 一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。 隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。 持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简单的说就是:要么全部执行成功,要么撤销不执行。 既然事务的概念从数据库而来,那Java事务是什么?之间有什么联系? 实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码中。因此,数据库操作的事务习惯上就称为Java事务。 二、为什么需要事务 事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。 举一个简单例子:比如银行转帐业务

数据库分库分表思路

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

Spring对Hibernate事务管理【转】

故事扮演 提交于 2020-03-02 08:12:58
Spring对Hibernate事务管理【转】 原文引自 http://express.ruanko.com/ruanko-express_42/tech-overnight2.html 每次带班,讲到Spring事务这一块的时候,大家总是有很多的疑问,其实Spring事务并不难,可能初次接触的时候有的不好理解,今天我们就详细来谈一下Spring的事务管理机制,主要是对Hibernate进行的事务管理。 在谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的。在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,我们这样做的原因是因为Hibernate默认的事务自动提交是false,他是需要我们人为的手动提交事务,假如你不想每次都手动提交事务的话,你可以在hibernate.cfg.xml我文件中把它设置为事务自动提交: <property name="hibernate.connection.autocommit">true</property> 当我们Spring对我们的Hibernate进行整合之后,我们的代码又出现了什么变化呢?整合,之后,我们不再是每次都去拿Session进行数据操作了,也不需要每次都开启事务,提交事务了

Spring的事务管理入门:编程式事务管理(TransactionTemplate)!!!

自作多情 提交于 2020-03-02 00:57:54
转载 自 http://blog.csdn.net/zq9017197/article/details/6321391 Spring可以支持编程式事务和声明式事务。 Spring使用事务管理器,每个不同平台的事务管理器都实现了接口:PlatformTransactionManager 此接口是事务管理的核心,提供了三个需要实现的函数: [java] view plain copy print ? commit(TransactionStatus status) ; getTransaction(TransactionDefinition definition) ; rollback(TransactionStatus status) ; 如果我们使用的是JDBC来处理事务,那么这个事务管理器就是DataSourceTransactionManager。 通过Spring文档查找到这个类,发现其需要DataSource这个类。也就是只要实现了javax.sql.DataSource这个接口的类,都可以作为参数传入到DataSourceTransactionManager。 然后,找到 包org.springframework.transaction.support中的 TransactionTemplate。 发现TransactionTemplate中有一个重要的方法: [java

php + mysql 分布式事务

寵の児 提交于 2020-03-01 15:16:10
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元; 事务应该具有4个属性:原子性、一致性、隔离性、持续性 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 分布式事务:分布式事务的参与者、资源管理器、事务管理器等位于不用的节点上,这些不同的节点相互协作共同完成一个具有逻辑完整性的事务。 纠正自己对mysql的一个误解,mysql从5.0开始支持XA DataSource。Connector/J 版本要使用5.0版本,5.0以下的不支持。   XA协议由Tuxedo首先提出的,并交给X/Open组织,作为资源管理器(数据库)与事务管理器的接口标准。目前,Oracle、Informix、DB2和Sybase等各大数据库厂家都提供对XA的支持