数据库事务

2020/01/29 02-事务ACID和隔离级别

北战南征 提交于 2020-02-01 04:18:14
事务是由若干条语句组成的,指的是要做的一系列操作。 关系型数据库中支持事务,必须支持4个属性,ACID A 原子性 atomicity 一个事务是一个不可分割的工作单位,事务中包括的所有操作要么全部做完,要么什么都不做 C 一致性 consistency 事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的 I 隔离性 isolation 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离 , 的,并发执行的各个事务之间不能互相干扰 D 持久性 durability 持久性也称永久性(permanence)。指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响 原子性,事务要么不做,要么做完 **并行执行事务和顺序执行事务的结果应该一致,当这些操作做完之后,多个事务执行完,要求并行执行和排队执行结果是一致的 ** 每个事务的操作不互相干扰, 事务一旦提交成功,数据库的改变就应该永久保存下来 做到这4点,才能叫支持事务的数据库,mysql的myisam不支持事务,innodb支持事务,一般需要解释下ACID,原子性,一致性(要求并行,且互不干扰),隔离性,持久性, 隔离级别 隔离性不好,会带来一些问题: 1.更新丢失 2.脏读 3.不可重复读 UNrepeatable

oracle redo undo

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-01 03:11:35
redo--> undo-->datafile insert一条记录时, 表跟undo的信息都会放进 redo 中, 在commit 或之前, redo 的信息会放进硬盘上. 故障时, redo 便可恢复那些已经commit 了的数据. redo解释: 在Oracle数据库中,执行数据修改操作后, 并不是马上写入数据文件,而是首先生成重做信息 ,并写入SGA中的一块叫LOG_BUFFER的固定区域,LOG_BUFFER的空间并不是无限大,事实上它非常小,一般设置在3~5MB左右。LOG_BUFFER有一定的触发条件,当满足触发条件后,会有相应进程将LOG_BUFFER中的内容写入一个特定类型的文件,就是传说中的联机重做日志文件。 UNDO: undo->记录更改前的一份copy,但你系统rollback时,把这份copy重新覆盖到原来的数据 redo->记录所有操作, 用于恢复 (redo records all the database transaction used for recovery) undo->记录所有的前印象, 用于回滚 (undo is used to store uncommited data infor used for rollback) redo->已递交的事务,实例恢复时要写到数据文件去的 undo->未递交的事务. redo的原因是

golang Mysql -- Tx

浪子不回头ぞ 提交于 2020-02-01 00:11:43
Transaction 事务 事务处理是数据的重要特性。尤其是对于一些支付系统,事务保证性对业务逻辑会有重要影响。golang的mysql驱动也封装好了事务相关的操作。我们已经学习了db的Query和Exec方法处理查询和修改数据库。 tx对象 一般查询使用的是db对象的方法,事务则是使用另外一个对象。sql.Tx对象。使用db的Begin方法可以创建tx对象。tx对象也有数据库交互的Query,Exec和Prepare方法。用法和db的相关用法类似。查询或修改的操作完毕之后,需要调用tx对象的Commit提交或者Rollback方法回滚。 一旦创建了tx对象,事务处理都依赖与tx对象,这个对象会从连接池中取出一个空闲的连接,接下来的sql执行都基于这个连接,直到commit或者rollback调用之后,才会把连接释放到连接池。 在事务处理的时候,不能使用db的查询方法,虽然后者可以获取数据,可是这不属于同一个事务处理,将不会接受commit和rollback的改变,一个简单的事务例子如下: tx, err := db.Begin() tx.Exec(query1) tx.Exec(query2) tx.commit() 在tx中使用db是错误的: tx, err := db.Begin() db.Exec(query1) tx.Exec(query2) tx.commit()

【教程】Mybatis 使用 -- Day 03【多表和事务】

佐手、 提交于 2020-01-31 21:09:39
文中代码托管在码云平台,点击进入 文章目录 连接池 事务控制以及设计方法 事务的基本概念 Mybatis中的事务操作 Mybatis 基于XML配置的动态SQL语句的使用 多表查询 一对多 一对一 多对多 连接池 连接池可以减少获取连接所消耗的时间和性能,就像一个容器,把连接初始化后放在这个容器里,当要用的时候就取出连接,可以说连接池就是一个用于存储连接的容器,该容器使用 集合 实现,该集合必须是 线程安全 的,不能两个线程拿到统一的连接,该集合还必须有队列的特性( 先进先出 ) Mybatis连接池提供了 3 种方式的配置 (1)配置的位置:主配置文件的 dataSource 标签,其type属性就是表示采用何种连接池,其值有三种: ❤ POOLED 采用传统的java.sql.DataSource规范中的连接,Mybatis中有针对规范的实现,每次使用的时候就从池中获取一个来用 ❤ UNPOOLED 采用传统的获取连接的方式,虽然也实现了java.sql.DataSource接口,但是并没有使用池的思想,每次使用的时候就创建一个新的连接来用 ❤ JNDI 采用服务器提供的JNDI技术实现来获取DATaSource对象,不同的服务器所能拿到的DataSource是不同的,如果不是web或者maven的var工程是不能使用的 。 (2)POOLED工作流程:首先查看空闲区

浅谈数据库事务

天大地大妈咪最大 提交于 2020-01-31 15:59:42
文章目录 隔离级别 数据库事务的知识 详解隔离级别 传播行为 传播行为的定义 @Transactional 调用失效问题 隔离级别 数据库事务的知识 数据库事务具有以下4 个基本特征, 也就是著名的ACID 。 Atomic (原子性):事务中包含的操作被看作一个整体的业务单元, 这个业务单元中的操作要么全部成功,要么全部失败,不会出现部分失败、部分成功的场景。 Consistency (一致性):事务在完成时,必须使所有的数据都保持一致状态,在数据库中所有的修改都基于事务,保证了数据的完整性。 Isolation (隔离性): 这是我们讨论的核心内容,正如上述,可能多个应用程序线程同时访问同一数据,这样数据库同样的数据就会在各个不同的事务中被访问,这样会产生丢失更新。为了压制丢失更新的产生,数据库定义了隔离级别的概念,通过它的选择,可以在不同程度上压制丢失更新的发生。因为互联网的应用常常面对高并发的场景,所以隔离性是需要掌握的重点内容。 Durability (持久性):事务结束后,所有的数据会固化到一个地方,如保存到磁盘当中,即使断电重启后也可以提供给应用程序访问。 详解隔离级别 未提交读 未提交读( read uncommitted )是最低的隔离级别,其含义是允许一个事务读取另外一个事务没有提交的数据。未提交读是一种危险的隔离级别,所以一般在我们实际的开发中应用不广,

MySQL事务隔离级别详解

坚强是说给别人听的谎言 提交于 2020-01-31 13:03:57
MySQL事务隔离级别详解 博客分类: SQL MySQL 数据结构 SQL SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。 Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。 Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。 Repeatable Read(可重读) 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行

MySQL事务隔离级别详解

家住魔仙堡 提交于 2020-01-31 13:03:16
原文地址: http://xm-king.iteye.com/blog/770721 SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。 Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。 Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。 Repeatable Read(可重读) 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行

MySQL事务隔离级别详解

白昼怎懂夜的黑 提交于 2020-01-31 13:02:34
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。 Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。 Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。 Repeatable Read(可重读) 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion

mysql 事务隔离级别

蹲街弑〆低调 提交于 2020-01-31 12:42:25
read-uncommitted(未提交读) 测试流程: 1、A设置read-uncommitted, start transaction 2、B执行start transaction,修改一条记录, 3、A查询记录,得到了以为正确的记录 4、B回滚。 问题:A读到了B没有提交的记录,也就是脏读。 read-committed(已提交读) 测试流程: 1、A设置read-committed, start transaction 2、B执行start transaction,修改一条记录,查询记录,记录已经修改成功 3、A查询记录,结果还是老的记录 4、B提交事务 5、A再次查询记录,结果是新的记录。 问题:解决了脏读的问题,但是出现一个新问题,A在一个事务中,两次读取的记录不一致,也就是不可重复读。 repeatable-read(可重复读) 测试流程: 1、A设置repeatable-read, start transaction,查询记录,结果是老的记录 2、B执行start transaction,修改一条记录,查询记录,记录已经修改成功 3、A查询记录,结果还是老的记录 4、B提交事务 5、A再次查询记录,结果还是老的记录。 问题:可以重复读,A在事务过程中,即使B修改了数据,并且commit,A读取的还是老的数据。实际上是A读取的数据还是事务开始时的快照。 注意

SQL Server 事务隔离级别详解

穿精又带淫゛_ 提交于 2020-01-31 12:32:18
from:http://www.cnblogs.com/chenmh/p/3998614.html 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一定的影响作用。 步骤 事务隔离级别通过影响读操作来间接地影响写操作;可以在回话级别上设置事务隔离级别也可以在查询(表级别)级别上设置事务隔离级别。 事务隔离级别总共有6个隔离级别: READ UNCOMMITTED(未提交读,读脏),相当于(NOLOCK) READ COMMITTED(已提交读,默认级别) REPEATABLE READ(可以重复读),相当于(HOLDLOCK) SERIALIZABLE(可序列化) SNAPSHOT(快照) READ COMMITTED SNAPSHOT(已经提交读隔离) 对于前四个隔离级别:READ UNCOMMITTED<READ COMMITTED<REPEATABLE READ<SERIALIZABLE 隔离级别越高,读操作的请求锁定就越严格,锁的持有时间久越长;所以隔离级别越高,一致性就越高,并发性就越低,同时性能也相对影响越大. 获取事务隔离级别(isolation level) DBCC USEROPTIONS 设置隔离 设置回话隔离