数据库事务的学习笔记

对事务本身的理解

1.事务是一组原子性的SQL查询,对于事务内的查询要么完全成功,要么完全失败。

2.mysql默认的事务是自动提交的,即autocommit=true,也就是说一个SQL查询即是一个事务。

3.对于多条语句,通过start transaction;和commit(rollback)进行配合,将多条语句包装为一个更大的事务单元。

4.如果设置autocommit=false,那么语句将不会被提交,直到使用rollback,或者commit。

5.事务的特性ACID(原子性,一致性,隔离性,持久性)

原子性:要求一个事务不可分割,里面的语句要么全部成功,要么全部失败,不会看到中间状态。

一致性:个人感觉是数据库数据本身和数据之间的约束关系在事务前后是不会变的。

隔离性:即一个事务在提交之前,他对记录的修改对其他事务不可见。为了防止过多的锁,MYSQL通过MVCC实现。

持久性:即事务对记录的修改,在提交时候会被永久的保存到磁盘上。MYSQL为了提高事务效率,存储引擎在修改数据时通常只修改内存数据,同时将修改操作记录到“事务日志”中,再异步的刷回磁盘。

对事务隔离级别的理解

Read Uncommited

未提交读,数据库级别的最低层次,事务会读到其他事务未提交的数据。这种事务级别只保证磁盘不出问题。产生的问题即脏读。

如图:

左侧事务中对age=4的记录进行了更新但是未提交,右侧事务使用uncommited read 读到了未提交的记录,使用其他事务级别则读到原值。

Read Committed

与read uncommitted不同,这个级别下的事务读不到其他事务未提交的记录.。这个在上一张图中就有体现。虽然Read Committed能够保证事务读到别人提交的记录,但是仍然存在在同一个事务中,对同一条记录读两次,值发生变化的情况。即两次select中有其他事务对该记录有更新。这种不一致的情况,成为“不可重复读”

如图:

在read committed下右边session启动一个事务,第一次查询age=4的记录值为xiaotong,然后左边对age=4的记录更新为myname,右边事务再查询时,发现记录已经变名字了。这就是在一个事务中对一条记录反复读取出现不一致情况,称之为“不可重复读”

Repeatable Read(mysql默认级别)

可重复读。针对read committed出现的情况,repeatable read 就是一种在事务内对统一记录反复查询不会出现不一致的事务级别,

如图:

如果设置右边事务级别为repeatable read,那么无论在事务过程中,其他事务如何更改记录值,右边事务对统一记录的查询结果始终一致。

Serializable(序列)

隔离级别最高的一种事务级别,要求不同事务之间串行执行,这样能够保证事务之间没有任何干扰,但是这样查询的效率很低,吞吐量低,需谨慎使用。序列的级别下,是不会存在幻读的,即在一个事务中,对一批事务进行更新,而在令一个事务中插入了一条新记录满足条件。这样更新事务就会发现更新操作在提交之后仍有满足条件而未更新的,称之为“幻读”。

事务相关常用sql

查询当前session的事务隔离级别

select @@tx_isolation

查看全局事务隔离级别

select @@global.tx_isolation

这是session的事务级别

set session(global)  transaction isolation level read uncommitted

(read committed,repeatable read,serializable)

时间: 2024-11-10 14:52:23

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

《NOSQL数据库入门》学习笔记

<nosql数据库入门> 第1章 nosql数据库的基础知识 1 1.1 关系型数据库和nosql数据库 2 1.1.1 什么是nosql 2 1.1.2 关系型数据库简史 2 1.1.3 数据库的分类 3 1.1.4 关系型数据库的优势 5 1.1.5 关系型数据库的不足 5 1.1.6 nosql数据库 9 1.2 nosql数据库是什么 12 1.2.1 键值存储 13 1.2.2 面向文档的数据库 14 1.2.3 面向列的数据库 14 1.3 如何导入nosql数据库 16 1.3.

Flas-SQLAchemy数据库操作使用学习笔记

Flas-SQLAchemy数据库操作使用学习笔记 1.为你的Flask应用加载Flask-SqlAlchemy扩展 Code example: 1.1from flask import Flask f rom flask.ext.sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' db = SQLAlchemy(ap

数据库SQL语句学习笔记(6)-使用函数处理数据

1.SQL也可以用函数来处理数据,函数一般是在数据上执行的,为数据的转换和处理提供了方便.但是每一个数据库管理系统(DBMS)都有特定的函数,事实上,只有少数几个函数被所有的DBMS等同地支持.例如, MYSQL中用SUBSTRING()函数提取字符串的组成部分,Access用MID() MYSQL中用CONVERT()函数进行数据类型转换,DB2使用CAST() MYSQL使用CURDATE()函数获取当前日期,SQLite使用DATE() 结论:SQL语句不是可移植的 2.SQL使用函数 文

数据库SQL语句学习笔记(2)-检索数据库

首先设置好此连载笔记的演示所用的表 CREATE database sells; #创建名叫sells的数据库 USE sells; #告诉mysql,我要开始使用这个数据库了 CREATE TABLE Customers #创建Customers表 ( cust_id char(10) NOT NULL , cust_name char(50) NOT NULL , cust_address char(50) NULL , cust_city char(50) NULL , cust_stat

MySQL数据库的基本操作 学习笔记

主要内容包括:创建数据库,删除数据库,不同类型的数据存储引擎和存储引擎的选择. 创建数据库,默认data目录下创建几个必需的数据库,用 SHOW DATABASES;查看如下: 其中mysql数据库描述用户访问权限,创建数据库是在系统磁盘上划分一块区域用于数据的存储和管理.基本格式为  CRATE DATABASE database_name; 如创建 test_db数据库 用如下命令查看test_db的定义 删除数据库,基本格式 DROP DATABASE database_name; 删除t

数据库SQL语句学习笔记(3)-排序检索数据

1.排序数据 如果不排序,数据一般将以它在底层表中出现的顺序显示,这有可能是数据最初添加到表中的顺序.但是如果数据随后进行过更新或删除,这个顺序就会受到DBMS重用回收存储空间的方式的影响. 子句:SQL语句由子句构成,有些子句是必须的,有些则是可选的.一个子句通常是由关键字加上所提供的数据组成.例如我们上个笔记中提到的SELECT语句中的FROM子句. 排序需要用到ORDER BY子句 SELECT prod_name FROM Products ORDER BY prod_name; 一定要

数据库的连接(学习笔记)

Oracle安装完成后,会在服务中增加几个服务 由于Oracle比较消耗系统资源,建议将服务类型改为手动,需要时,再手动打开,不用时将服务关闭 也可以用以下批处理来完成. 启动: @echo off echo 确定要启动Oracle 11g服务吗? pause net start OracleOraDb11g_home1TNSListener net start OracleServiceORCL net start OracleDBConsoleorcl echo 启动Oracle 11g服务

数据库SQL语句学习笔记(5)-创建计算字段

1.存储在表中的数据并不总是应用程序需要的,比如说我们有商品的单价,有售出商品的数量这两个列,但是我们为了打印发票,需要总价信息,即单价*商品.因此,我们需要直接从数据库中检索出转换,计算或格式化过的数据,而不是检索出数据.此时单价和数量是一般的表列,而总价就是计算出的字段. 字段:基本上与列的意思相同,经常互相使用,不过数据库列一般称为列. 只有数据库自己知道哪些列是列,哪些列是字段.应用程序并不能识别. USE sells; SELECT * FROM Vendors; 2. 拼接(conc

Deltasql 数据库版本管理工具学习笔记

一.Deltasql 功能 二.Deltasql服务器端和客户端的安装 2.1 Deltasql服务器端的安装 2.2 Deltasql客户端的安装 三.Deltasql的使用 四.Deltasql 原理 五.还待研究的地方 一.Deltasql 功能 目前我们对数据库的管理是比较少的,尤其在对数据库版本的控制方面.比如说当我们想恢复到以前的数据库版本,当客户A需要X版本的数据库,客户B需要Y版 本的数据库,当发布项目的时候项目的数据库和开发人员的数据库是否一致,等等这些问题解决起来还是会有一定