关系型数据库(六),数据库事务

目录

1.ACID

2.事务并发引起的问题

3.事务隔离机制

4.为什么不直接设置为串行化事务隔离级别

六、数据库事务

1.ACID

(1)原子性(Atomic)

  整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

(2)一致性(Consistency)

  一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。

(3)隔离性(Isolation)

  隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

(4)持久性(Durability)

  在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

2.事务并发引起的问题

(1)脏读

  事务A读取事务B修改之后还未提交的数据,然后事务B进行回滚,shiwuA读到了一条不存在的数据,导致脏读。

(2)不可重复读

  事务A读取一条数据,事务B将其修改之后,事务A再次读取发现两次数据读取不一样,导致不可重复读。

(3)幻读

  事务A第一次查询表中数据条数,然后事务B提交了新的数据,事务A再次读发现两次读取条数不一致,导致幻读。

不可重复读和幻读到底有什么区别呢?

(1)不可重复读是读取了其他事务更改的数据,针对update操作

  解决:使用行级锁,锁定该行,事务A多次读取操作完成后才释放该锁,这个时候才允许其他事务更改刚才的数据。

(2)幻读是读取了其他事务新增的数据,针对insert操作

  解决:使用表级锁,锁定整张表,事务A多次读取数据总量之后才释放该锁,这个时候才允许其他事务新增数据。

3.事务隔离机制

(1)READ UNCIMMITTED(未提交读)

  事务中的修改,即使没有提交,其他事务也可以看得到,比如说上面的两步这种现象就叫做脏读,这种隔离级别会引起很多问题,如无必要,不要随便使用

(2)READ COMMITTED(提交读)(Oracle级别)

  大多数数据库系统的默认隔离级别是READ COMMITTED,这种隔离级别就是一个事务的开始,只能看到已经完成的事务的结果,正在执行的,是无法被其他事务看到的。这种级别会出现读取旧数据的现象

(3)REPEATABLE READ(可重复读)(MYSQL级别)

  REPEATABLE READ解决了脏读的问题,该级别保证了每行的记录的结果是一致的,也就是上面说的读了旧数据的问题,但是却无法解决另一个问题,幻行,顾名思义就是突然蹦出来的行数据。指的就是某个事务在读取某个范围的数据,但是另一个事务又向这个范围的数据去插入数据,导致多次读取的时候,数据的行数不一致。

(4)SERIALIZABLE(可串行化)

  SERIALIZABLE是最高的隔离级别,它通过强制事务串行执行(注意是串行),避免了前面的幻读情况,由于他大量加上锁,导致大量的请求超时,因此性能会比较底下,再特别需要数据一致性且并发量不需要那么大的时候才可能考虑这个隔离级别

4.为什么不直接设置为串行化事务隔离级别

  由于性能原因,事务隔离级别越高,安全性越高,串行化执性越严重,降低了数据库的并发度,因此要随着业务需求选择合适的级别。

原文地址:https://www.cnblogs.com/xzmxddx/p/10356015.html

时间: 2024-08-30 15:58:11

关系型数据库(六),数据库事务的相关文章

关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)

本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies 紧接上一篇文章,本文翻译了如下章节: 一. Log manager(日志管理) 通过前面的章节,我们已经知道,为了提升性能,数据库会将数据缓存在内存中.但是,如果在事务提交过程中,数据库服务器崩溃了.缓存在内存的数据就会丢失

免费开放阅读 | 数据库管理系统的事务原理(上)

作者介绍: 那海蓝蓝,腾讯技术工程事业群计费平台部金融云TDSQL数据库T4级专家,熟悉PostgreSQL.MySQL.Informix等数据库内核技术,著有<数据库查询优化器的艺术>一书.<数据库事务处理的艺术>为最新出版力作,经机械工业出版社授权,"腾讯技术工程官方号"将独家免费开放阅读,我们将分期为读者奉上那海蓝蓝的技术盛宴. 本篇介绍数据库管理系统的事务处理技术,从数据库的事务理论出发界定事务处理技术的范围,讨论了事务机制应对的问题.事务处理的理论基础

数据库知识之事务

事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).在计算机术语中,事务通常就是指数据库事务. 概念 一个数据库事务通常包含对数据库进行读或写的一个操作序列.它的存在包含有以下两个目的: 1.为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法.2.当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰. 当一个

第六章、数据库及数据库对象

第六章.数据库及数据库对象 内容提要: 1.了解数据库的组成及特点 2.掌握SQL Server2008的安装与配置 3.掌握数据库的创建及维护方法 4.掌握架构的定义与维护方法 5.掌握分区表.索引及视图的创建及维护方法 第一节.创建及维护数据库 1.1.SQL Server数据库概述 SQL Server的发展史 SQL Server 7.0(1999年,正式跻身企业数据库行列) SQL Server 2000(2000年,代表产品) SQL Server 2005(2005年,代号"Yuk

SharePoint 2010 数据库xxx的事务日志已满

http://www.cnblogs.com/sygwin/p/6222428.html 接到领导安排,说客户有问题 请求协助解决,对方给我展示的错误日志,如下: 数据库'WSS_Content_xxxx'的事务日志已满.若要查明无法重用日志中的空间的原因,请参阅sy.databases中的log_reuse_wait_dec列 导致的结果是用户再也无法上传文件到文档库了. 看来一下对应的数据库文件,日志文件大的惊人,已经超过1.8T 作为老司机,理论上解决这样的问题,就是收缩数据库.可是咱是个

数据库中的事务和并发问题探讨

数据库中的事务和并发问题探讨 引子 最近有同事写了段代码,负责创建订单的逻辑,代码审查时发现可能会有并发的问题.同事并不认同,他认为他的逻辑是写在存储过程中的,应该没有问题. 代码的逻辑大概是(伪代码): begin transaction if 查询到客户存在进行中的订单 rollback transaction if 查询到设备存在进行中的订单 rollback transaction 插入订单 commit transaction 下面针对这个逻辑进行分析,为什么这个事务会出现并发问题.

MySql数据库并发和事务资料汇总

InnoDB多版本并发控制-MVCC http://my.oschina.net/xinxingegeya/blog/208821 MySql并发控制 http://my.oschina.net/xinxingegeya/blog/215417 MySQL之事务 http://my.oschina.net/xinxingegeya/blog/215419 MySql命令行控制事务 http://my.oschina.net/xinxingegeya/blog/296459 MySQL事务隔离级别

数据库学习之事务控制

事务概述: 1.事务是数据库并发控制和恢复技术的基本单位: 2.事务具有四个特性,分别是:原子性,一致性,隔离性,持久性: 3.事务是一些数据库操作的集合,由一组相关的SQL语句组成: Oracle事务的隔离级别: Oracle数据库为事务提供了两个级别的隔离. 1.read commited: (1)每个事务所执行的查询操作只能获取在该查询开始之前(不是该事务开始之前)已经提交的数据. (2)可以防止丢失修改和脏读的问题,但是不能防止不可重复读的问题. (3)若数据被加锁则等待其他事务解锁:

数据库开发基础-教案-3-认识数据库备份和事务日志备份

认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点. 数据库备份 数据库备份可以手动备份和语句备份 一.手动备份数据库 1.鼠标右键选择你要进行备份的数据库-任务-备份 可以在常规选项页面你可以选择备份类型是进行完整数据库备份还是差异数据库备份 2.点击添加选项,选择数据库文件的存放路径 注意文件名记得加后缀.bak,便于恢复时的查找 数据库还原 右键数据库-

C# access数据库软件使用事务插入多条记录

C# access数据库软件使用事务插入多条记录 protected void Button1_Click(object sender, EventArgs e) { /*=============测试通过===============*/ OleDbConnection con = new OleDbConnection(“Provider=Microsoft.Jet.OleDb.4.0;Da ta Source=C:/Inetpub/wwwroot/DotNetArticle/App_Dat