事务隔离机制

数据库隔离机制,要看事务!!!(两个事务读到的数据不一致不能算脏读什么的,只能是同一个数据读到的不一致。或者你一个读取的事务插到人家正在update的事务中了就是脏读。)

先说几个并发时候容易出现的问题:

1、更新丢失

分为两类 第一类,

覆盖丢失 

(最后提交的事务B会覆盖B事务执行过程中的别的事务进行的修改):比如一个链接是要去改name,load一个name1,age1两个数据出来,修改了之后,事务还没提交的时候,又来了一个链接,load了同样的一个name1,age1出去,等第一个请求事务提交了之后,name1改成name2,age1还是age1,。然后第二个链接修改了age1是age2,name1还是name1,提交事务,修改了之后,数据库中是name1,age2.也就是说第一个连接做的修改是无效的。

2、回滚丢失        写的事务中插入写的事务                         ( 关键词:一条事务A回滚的时候,会把此时别的事务的修改覆盖,还原成A事务开始时候的数据),比如银行里面,一个连接进来,从银行里取了100块,银行账户少了100元,从1000变成900了,准备转账到另外一个账户的时候发生了错误,所以事务回滚,900再变成1000.

但是问题是,如果这个1000剪成900的时候有一个连接进来,读取到了900元的数据库信息,准备往里面存100元,然后把总价设定成1000元。但是在这之前如果事务回滚已经设置成1000元。按理说再存100应该是1100,但是此时读取的是900,存100之后就是1000,所以会导致客户损失100元。

2.脏读:在写的事务中插入读取事务

//3和4是同一个事务两次读取。

3.不可重复读取,  在读的事务中插入写的事务                       我一个事务读取这条数据两次,但是却不一致,因为你在我事务期间update了。

4.幻读: 在读的事务中插入增删的事务                                我一个事务对数据库进行两次查询,但是数据数目不一样,因为你在我事务期间增或者删了。

解决办法:数据库四种隔离机制:

一:Read uncommitted  :写的时候可以读。

比如回滚丢失的情况,有一个事务已经开始写某条数据了,那么只允许其他事务查询,不允许其他事务修改。因为像这种回滚的事务执行的时间一般会很长,直接存款的事务很短,一般会落在有可能回滚的事务的内部。这样可以避免回滚丢失。但是这样的话我写的时候你能读,就会发生脏读。而且我写之前你读了,写之后你再读,就是不可重复读。我写的时候你读,读完了你再写,就是第二类更新丢失。但是我写的时候你读,那么会读出来多出来或者少一部分数据。这就幻读了。

二:read committed 写的时候不能读。

这样就避免了脏读,因为脏读是在一个写的事务中间插入读的事务。读的事务中间插入写,不算脏读。但是我同一个事务的两次读的时候你要是增删了,那就会导致我不可重复读,和幻读。

三:Repeatable read  读的时候不能写。

这样的话脏读肯定是不会,而且我读的时候你不能写,那么我就不会不可重复读。我读的时候虽然你不能写但是你能删增,所以还是有可能造成我幻读。

四:Serializable:我操作的时候你什么都不能做

这样什么乱起八糟的是都没了,就是效率低了

时间: 2024-10-15 01:53:14

事务隔离机制的相关文章

理解MySql事务隔离机制、锁以及各种锁协议

一直以来对数据库的事务隔离机制的理解总是停留在表面,其内容也是看一遍忘一边.这两天决定从原理上理解它,整理成自己的知识.查阅资料的过程中发现好多零碎的概念如果串起来足够写一本书,所以在这里给自己梳理一个脉络,具体的内容参考引文或在网上搜一下.由于平时接触最多的是MySQL,所以文章中某些部分是MySQL特有的特性,请读者注意. 数据库并发操作会引发的问题: 多个事务同时访问数据库时候,会发生下列5类问题,包括3类数据读问题(脏读,不可重复读,幻读),2类数据更新问题(第一类丢失更新,第二类丢失更

事务隔离机制_悲观锁_乐观锁

5. 事务并发处理 a) 事务的特性:ACID i.Atomicity 原子性 ii.Consistency 一致性 iii.Isolation 隔离性 iiii.Durability 持久性 b) 事务并发时可能出现的问题 i. 第一类丢失更新(Lost Update) 时间 取款事务A 存款事务B T1 开始事务   T2   开始事务 T3 查询账户余额为1000元   T4   查询账户余额为1000元 T5   汇入100元把余额改为1100元 T6   提交事务 T7 取出100元把

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制

首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行. (2) C:一致性(Consistency) 事务完成时,数据必须处于一致的状态.若事务执行途中出错,会回滚到之前的事务没有执行前的状态,这样数据就处于一致的状态.若事务出错后没有回滚,部分修改的内容写入到了数据库中,这时数据就是不一致的状态. (3) I:隔离性(Isolation) 同时处理多个事务时

数据库的事务隔离机制

事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度. 两个并发事务同时访问数据库表相同的行时,这些问题可以归结为5类: 3类数据读问题(脏读.不可重复读和幻象读) 2类数据更新问题(第一类丢失更新和第二类丢失更新). 1.幻读:事务T1读取一条指定where条件的语句,返回结果集.此时事务T2插入一行新记录,恰好满足T1的where条件.然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想. 2.不可重复读取:事务T1读取一行记录,紧接着事务T2修改了

hibernate缓存机制和事务隔离机制

一级缓存( Session缓存) }         一级缓存的管理 ?          应用程序调用Session的save().update().saveOrUpdate().get()或load(),以及调用查询接口的 list().iterate() 时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中. ?          可以通过close/clear/evict清空缓存 }         作用 因为Session的生命期往往很短,

Hibernate 再接触 事务隔离机制

事务:要么都要完成,一个不完成就要回滚. ACID 原子性 一致性 独立性 持久性 第一类丢失更新 第一类丢失更新 脏读(读了另外一个事务没有提交的数据) 不可重复读(在同一个事务里,对数据库里的值前后读取值不一样) 第二类丢失更新(不可重复读的特殊情况) 幻读/(插入/删除)(读的时候,插入一条数据前后不一致) repeatable read 给数据库加把锁 别的无法改这条记录 serial 安全级别最高 但是速度最慢 一般设置为2 read-committed 不设的话依赖于数据库 原文地址

oracle 事务 锁机制

本课内容属于Oracle高级课程范畴,内容略微偏向理论性,但是与数据库程序开发和管理.优化密切相关:另外本课的部分内容在前面章节已经涉及,请注意理论联系实际. 事务  事务(Transaction)从 通讯的角度看:是用户定义的数据库操作序列,这些操作要么全做.要么全不做,是不可分割的一个工作单元.事务控制语句称为TCL,一般包括Commit和Rollback. 事务不是程序,事务和程序分属两个概念.在RDBMS中,一个事务可以有一条SQL语句.一组SQL语句或者整个程序:一个应用程序又通常包含

关于postgresql中事务隔离的总结

1 介绍 具有基本知识的DBA都知道,PostgreSQL在控制数据的一致性是通过使用一种多版本模型来维护的,也就是常说的多版本并发控制MVCC.这也就意味着每一个sql语句看到的都只是一小段时间的数据库快照,或者称为版本,而并不关心底层的数据文件当中的当前状态.这样带来的好处就是保护每一个会话中的事务不受到其他会话的影响,提供了非常好的事务隔离机制.MVCC并发控制模型相对于锁机制的优点在于,查询数据的锁请求与写数据的锁请求并不冲突,所以,读不会阻塞写,写也不会阻塞读. 2 事务隔离 其实说起

面试必问的MySQL锁与事务隔离级别

之前多篇文章从mysql的底层结构分析.sql语句的分析器以及sql从优化底层分析, 还有工作中常用的sql优化小知识点.面试各大互联网公司必问的mysql锁和事务隔离级别,这篇文章给你打神助攻,一飞冲天. 锁定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如 CPU.RAM.I/O等)的争用以外,数据也是一种需要用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库需要解决的问题,锁冲突也是影响数据库并发性能的一个重要因素. 锁分类 从性能