事务隔离 保证一系列操作的完整性

3 事务隔离 保证一系列操作的完整性

在mysql中什么是事务?

????举例说明:转账行为

????????????你要给朋友转100块钱,而此时你的银行卡只有100块钱。

?

转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这100块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时就要用到"事务"这个概念了。

?

事务定义:

事务就是要保证一组数据库操作,要么全部成功,要么全部失败。

在MySQL中,事务支持是在引擎层实现的。

MySQL是一个支持多引擎的系统,并不是所有的引擎都支持事务。比如MySQL原生的MyISAM引擎就不支持事务,这也是MyISAM被InnoDB取代的重要原因之一

注意:只有innodb引擎才支持数据库或表的事务

?

事务的特点?ACID

????事务的四大特点

Atomicity、原子性

Consistency、一致性

Isolation、隔离性

Durability,持久性

?

Atomicity 操作 原子性

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

?

Consistency 数据库 一致性

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作

Isolation 事物之间 隔离性

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)

?

Durability 数据修改 持久性

事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

?

注意:

在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

?

重点理解 隔离性 isolation

当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了"隔离级别"的概念。

?

脏读:在一个事务处理过程里读取了另一个未提交的事务中的数据

当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致

不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

   例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。

   不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据

?

虚读:幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所 有 的行的某个数据项做了从"1"修改为"2"的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为"1"并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

?

   幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

?

在谈隔离级别之前,首先要知道,你隔离得越严实,效率就会越低。因此很多时候,我们都要在二者之间寻找一个平衡点。SQL标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable )。下面我逐一为你解释:

?

读未提交:一个事务还没提交时,它的变更就能被别的事务看到。

?

读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。

?

可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。

?

串行化,顾名思义是对于同一行记录,"写"会加"写锁","读"会加"读锁"。当现 读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

????????

原文地址:https://www.cnblogs.com/binyang/p/11260298.html

时间: 2024-10-09 14:02:40

事务隔离 保证一系列操作的完整性的相关文章

事务隔离级别,操作

然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. 2 [mysqld] 3 transaction-isolation = REPEATABLE-READ 这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级别 2.对当前session修改,在登录mysql客户端后,执行命令: 要记

事务隔离怎么保证

一.什么是事务 事务:在数据库操作中事务就是一条或者多条SQL语句组成的一个不可分割的工作单元. 特点:在事务当中的所有操作都正常完成时,整个事务才被提交到数据库当中,如果有一项操作没有完成,那么整个事务会被回滚. 二.事务的四大特性(ACID) A : 原子性: 同一个事务中可能有多条sql语句,要么全部成功,要么直接回滚 C : 一致性: 事务中操作的数据以及状态改变是一致性的,即写入的结果必须完全符合预设的规则,不会出现系统意外等原因导致状态不一致. I : 隔离性: 一个事务所操作的数据

数据库之子查询和事务隔离级别

数据库大的知识点,特此补上.看的还是<漫画数据库>. 一.查询 如果要从一个数据库里面检索出某一字段为最大的数据项,那用什么方法呢?--其实用子查询就可以查到. 1)子查询是查询里面再嵌套查询. people表: 如果我要查询年龄最大的那一行数据项.就可以使用子查询. select * from people where age = (select max(age) from people); 选出people里面的最大年龄,再选出年龄等于最大值的数据. 当然,还有另外一种方法. select

事务隔离

引自:http://blog.csdn.net/turkeyzhou/article/details/7636165 1      什么是事务 1.1 我们为什么需要事务 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关 操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠.一个逻辑工作单元要成为事务,必须满足所谓的

MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)

MySQL 事务处理 简单介绍事务处理: MySQL 事务主要用于处理操作量大,复杂度高的数据. 比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行.换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的.如果在事务的任何操作失败,则整个事务将失败. 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全

数据库事务、事务隔离级别以及锁机制详解

以下主要以MySQL(InnoDB引擎)数据库为讨论背景,纯属个人学习总结,不对的地方还请指出! 什么是事务? 事务是作为一个逻辑单元执行的一系列操作,要么一起成功,要么一起失败.一个逻辑工作单元必须有四个属性,称为 ACID(原子性.致性.隔离性和持久性)属性,只有这样才能成为一个事务. 数据库事物的四大特性(ACID): 1)原子性:(Atomicity) 务必须是原子工作单元:对于其数据修改,要么全都执行,要么全都不执行. 2)一致性:(Consistency) 事务在完成时,必须使所有的

&lt;事务隔离性&gt;

Overview 事务的隔离性是指在并发环境中,并发的事务是隔离的.一个事务的执行不能被其他事务干扰. 也即,不同的事务并发操作相同数据时,每个事务都有各自完整的数据空间. 隔离性 在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同,包括: 未授权读取,也称为读未提交(Read Uncommitted).该级别允许脏读取,其隔离级别最低.[关于脏读,幻读,blabla...请往下拉].如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还未进行事务提交

sqlserver事务隔离级别

数据库是要被广大客户所共享访问的,那么在数据库操作过程中很可能出现以下几种不确定情况. 更新丢失(Lost update) 两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了.这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来. 脏读(Dirty Reads) 一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交.这是相当危险的,因为很可能所有的操作都被回滚. 不可重复读(Non-repeatable Reads) 一个事

Mysql事务-隔离级别

MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被视为一个不可分割的单元: 一致性(Consistency):数据库总是从一种状态切换到另一种状态: 隔离性(Isolation):通常来说,事务在提交前对于其他事务不可见: 持久性(Durablity):一旦事务提交,所做修改永久保存数据库: 事务最常用的例子就是银行转账.假设polo需给lynn转