数据库事务学习笔记

水平有限,有错误之处望大神们指出,不胜感激

什么是事务

引用《高性能Mysql》中的定义:
事务就是一组原子性的sql查询,或者说一个独立的工作单元。如果数据库引擎能够成功的对数据库应用该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。

事务的特性

  • 原子性(Atomicity)
    一个事务中的所有sql操作是一个整体,要么全部成功提交,要么全部失败回滚,不允许中间状态。
    原子性的语义,只保证记录了回滚段,这个回滚段能够回滚到之前的版本。
    为了实现原子性,需要通过undo日志。将所有对数据的更新操作写入日志,如果一个事务中执行了一部分操作,后面的操作由于断电/系统崩溃等其他原因无法继续,则通过回溯日志,将已经执行过的操作撤销,从而达到“全部失败回滚”的目的。
    场景:数据库系统崩溃后重启,此时数据库处于不一致的状态,必须先执行一个crash recovery的过程,读取日志进行redo(重新执行将所有已经成功提交但为写入磁盘的操作,保证持久性),再对所有崩溃时未成功提交的事务进行undo(撤销所有执行了一部分但尚未比较的操作,保证原子性)。crash recovery结束后,数据库恢复到一致性状态。
  • 一致性(Consistency)
    书本定义:数据库总是从一个一致性的状态转换到另一个一致性的状态。
    就我个人的理解,事务的ACID中,一致性是最基本的属性,其他的三个属性都是为了保证一致性而存在的。首先我觉得我们可以把数据库的一致性状态和一个事务单元的一致性拆开来说。数据库的一致性就是一个系统的状态,一个合理的状态。而是否合理这表现在这个状态是否符合业务规则。比如说A给B转战,业务要求总额不变,那么这个一致性状态就是总金额相同。当我们的代码中写了A = A-100时,就必须再写上B = B+100才能保证一致性,否则数据库就处于不一致的状态。那么事务单元的一致性是什么?就是在事务开始和结束时,要么是A=100/B=0的状态要么是A=0/B=100的状态。这跟原子性的概念又有些重合了。但是在有些情况下,比如说事务1执行完A=A-100时,事务2执行了A=A+200,事务2结束,但是事务1回滚了到了A=100/B=0,此时整个数据库少了200,违背了一致性。所以事务如果具备一致性能保证什么?一致性保证一个事务单元全部操作结束了之后才可见,事务开始和结束之间的中间状态不会被其他事务所看到,开始和结束时的状态相同。结合上面来看,在强一致性的保证下,事务与事务之间保持happen-before关系,那么数据库一定是处于一致性的状态。
  • 隔离性(Isolation)
    书本定义:事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
    这个的定义感觉又跟一致性很像,其实在序列化读写这个隔离级别下,就相当于保证了事务的强一致性。但是这样做的代价就是性能很差。
    所以隔离性的引入,其实是以性能为理由,对一致性的破坏。核心目的,就是尽可能的提高并行度。
  • 持久性(Durability)
    每一次的事务提交后就会保证不会丢失。这个没什么好说的。
    ### 事务的隔离级别
时间: 2024-09-30 12:11:18

数据库事务学习笔记的相关文章

数据库事务学习详细教程

什么是事务 事务指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败,不允许出现部分成功的情况. 事务的特性 定义了事务之后,事务四个特性     原子性    事务是不可分割的单位,事务中的这组操作要么都发生,要么都不发生.    一致性    一致性说是事务执行前后必须要保持一致,不能出现凭空消失的情况,典型的如银行转账的操作,A给B转账,如果刚开始两人总共有100元,转账完成后两人总共还要有100元.    隔离性    多个用户并发访问数据库的时候,一个用户的事务不能被其他的用户的

java 数据库编程 学习笔记 不断更新

最近开始学习java,感觉java的数据库编程需要发个随笔记录一下,话不多说 切入正题.   一.数据库访问技术的简介                      应用程序  →  执行SQL语句 →数据库 → 检索数据结果 → 应用程序     ( ODBC         JDBC(两个常用的API))    java主要使用的 JDBC驱动程序进行数据库的编程 Java 应用程序 <------> JDBC   <------>  数据库     二.JDBC 的体系结构  

Oracle数据库临时表学习笔记

临时表的概念 在Oracle数据库中还有一种类型的表,叫做临时表.这个临时表跟永久表最大的区别就是表中的数据不会永远的存在.当一个会话结束或者事务结束的时候,这个临时表中的数据,不用用户自己删除,数据库自己会自动清除.(表是全局,只是数据消失) 会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据.南京Oracle认证培训   事务级临时表是指临时表中的数据只在事务生命周期中存在.当一个事务结束(commit or rollback)

mysql数据库入门学习笔记(1/2)

数据库一直没怎么重视,前段时间看了看mysql的基础知识,不看不知道,一看吓一跳,很多基础都竟然不知道,一直傻傻的用一些简单的.笨笨的方法,看了之后原来竟是如此如此,生活如此多娇,以前看不懂的,现在也懂点了,以前看到就头晕的,现在不晕了,发现一个奇怪的现象,应该很多人都有吧,当学一种知识的时候,而当时确实又是学不会.学不好的时候,随着时间的慢慢推移,再回过头来看的时候,发现比以前容易接受得多了--难怪这么多人到快挂的时候才后悔,不扯这么多了,把记录的笔记分享出来,方便日后查悦. 一.data数据

用ado.net进行分布式程序设计更新数据库(学习笔记)

提供一个数据服务类,调用GetDataSet就得到需要的DataSet,然后在用户界面进行修改,最后调用SaveDate就可以把未定的更改保存到数据库.using System;using System.Data ;using System.Data.SqlClient ; namespace AsterDnet.DataBind{    /// <summary>    /// Summary description for GetData.    /// </summary> 

oracle数据库字符集学习笔记

一.什么是oracle字符集 oracle字符集实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合. 影响oracle数据库字符集最重要的参数是NLS_LANG参数. 它的格式如下: NLS_LANG = language_territory.charset 它有三个组成部分(语言.地域和字符集),每个成分控制了NLS子集的特性. 其中: Language:指定服务器消息的语言,影响提示信息是中文还是英文 Territory:指定服务器的日期和数字格式 Charset:

mysql数据库基本操作学习笔记(1/2)

以下以数据库"ceshi"为例 1.连接数据库  代码如下 复制代码 mysql -u username -p password 2.创建/删除数据库  代码如下 复制代码 创建:create database ceshi; 删除:drop database ceshi; 3.创建/删除数据表 创建:  代码如下 复制代码 create table students (sid int(10) auto_increment primary key,name varchar(255),co

spring学习笔记(20)数据库事务并发与锁详解

多事务运行并发问题 在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分类: 1. 第一类丢失更新:撤销一个事务,其他事务已提交的更新数据覆盖 2. 第二类丢失更新:一个事务覆盖另一个事务已提交的更新数据 3. 脏读:一个事务读到另一个事务未提交的数据 4. 虚读:一个事物读到另一个已提交的新插入数据 5. 不可重复读:事务读到另一个事务已提交的更新数据 下面对这几类并

MySQL数据库学习笔记(一)

mysql|笔记|数据|数据库         我一直从事Informix和Oracle数据库开发,有一天发现网络上有一种小巧别致的数据库,被广泛使用,从MySQL的网站http://www.mysql.com/我下载了它的数据库软件,使用过后觉得真的挺好,这是我的一点学习笔记希望对各位初学者有点帮助. 1.       MySQL数据库介绍 MySQL 是瑞典的MySQL AB公司开发的一个可用于各种流行操作系统平台的关系数据库系统,它具有客户机/服务器体系结构的分布式数据库管理系统.MySQ