精华内容
下载资源
问答
  • 1.基本概念1)事务:指一组SQL语句,是在一次逻辑中对数据库执行一系列操作2)回退:指撤销指定SQL语句过程3)提交:指将存储SQL语句结果写入数据库表4)保留点:指事务处理中设置临时占位符,可以对它发布回...

    1.基本概念

    1)事务:指一组SQL语句,是在一次逻辑中对数据库执行的一系列操作

    2)回退:指撤销指定SQL语句的过程

    3)提交:指将未存储的SQL语句结果写入数据库表

    4)保留点:指事务处理中设置的临时占位符,可以对它发布回退

    5)事务处理:事务处理可以用来维护数据库的完整性,它保证成批的mysql操作要么完全执行,要么完全不执行

    2.事务的性质

    1)原子性:事务中定义的一系列操作,要么完全执行,要么完全不执行

    2)一致性:必须使所有的数据都保持一致的状态。比如:A账户和B账户各有1000块钱,不论它们之间怎么相互转账,都应该保持账户总额为2000元。

    3)持久性:事务成功提交的数据应该永远保存在数据库。

    4)隔离性:如果有多个事务操作同一条数据,应该保证事务之间不会相互影响。

    3.数据库事务执行会出现的问题

    事务出现的问题就是多线程操作,即多个线程操作同一条数据。主要会出现的问题如下:

    1)第一类更新问题:事务之间会覆盖掉其他已提交事务

    例子如下:

    0818b9ca8b590ca3270a3433284dd417.png

    最后账户的余额应该是1000元,中间的问题很明显,事务A覆盖了事务B的部分操作,结果就导致银行客户损失了100元。

    2)脏读问题:读了还未提交的数据。

    例子如下:

    0818b9ca8b590ca3270a3433284dd417.png

    事务过程如上,问题很明显,读了不该读的数据,结果导致银行损失了1000元。

    3)幻读:前后读取结果的记录数不一样。

    例子如下:

    0818b9ca8b590ca3270a3433284dd417.png

    4)不可重复读:前后读取的结果的值不一样

    例子如下:

    0818b9ca8b590ca3270a3433284dd417.png

    4.MySql数据事务处理语句

    1)标示事务处理开始:start transaction

    2)回退:rollback。注意:rollback只能在一个事务处理内使用,在执行一条start transaction命令之后;事务处理用来管理insert、update和delete语句,不能回退select语句。例子如下:

    select * from ordertotals;

    start transaction;

    delete from ordertotals;

    select * from ordertotals;

    rollback;

    select * from ordertotals;

    3)提交:commit。一般的mysql语句都是隐含提交,即提交操作是自动进行的。但是,在事务处理块中,提交不会隐含地进行,要使用commit语句。

    4)使用保留点:为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符。这样,如果要回退,就可以回退到某个占位符,这些占位符就称为保留点。如:

    savepoint delete1;

    rollback to delete1;

    展开全文
  • 一:脏读:事务A修改了某个值,但是未提交,这时候事务A又读取了这个值,事务A可能又把该值撤销(回滚),这时候数据可能就是无用数据。这就叫脏读。这里有些同学可能就要问了,既然事务A没提交,事务B是怎么读取...

    MYSQL事务并发处理的问题:脏读、不可重复读、幻读


    MYSQL5.5.X的版本默认引擎为:InNODB,在此之前是MyIASM。Innodb支持事务,MyIasm不支持事务。


    一:脏读:事务A修改了某个值,但是未提交,这时候事务A又读取了这个值,事务A可能又把该值撤销(回滚),这时候的数据可能就是无用数据。这就叫脏读。这里有些同学可能就要问了,既然事务A没提交,事务B是怎么读取到的?如果MYSQL隔离级别设置ReadUnCommitted,这时候其他事务就可以读取到未提交的事务。(重点在于未提交)


    二:不可重复读:事务A读取某个数据后,再次读取发现数据已经改变,两次或者多次读取同一数据数据不一致。(重点在于修改,数据本身对比

    场景1:在同一个事务中,A查看自己工资有1000元,准备取出来,这个过程没有结束;此时财务人员在更新工资,把工资更新为2000,当A在取的时候,发现多了1000块,这个过程在这里看起来没啥问题,这就是不可重复读,下面看另外一个场景。

    场景2:A今天查看自己卡了有1000,于是打算消费,此时A的老婆B正在网上转账,当A消费的那一刻,发现卡里钱不够了,明明刚才还有1000,为什么没了呢?因为老婆刚才转出去了,这就尴尬了。要避免这种情况,就要采用事务隔离级别,Repeatable read 重复读。在A读取的时候(事务开始,但还未结束。),这个时候A的老婆B不能转账,除非A的事务结束。


    三:幻读:相同的查询在事务执行后,发现得到的结果不一样,明明执行了5个操作,却发现多了N个,或少了N个,就好像发生了幻觉一样。(重点在于新增和删除,数据条数对比

    场景1:财务今天修改了员工表的一些记录,同时,其他人事又添加了一名新员工进来,此时财务人员就发现,怎么多了几条记录?


    附录:


    此图转自互联网

    MySQL 默认的级别是:Repeatable read 可重复读,其他主流数据库,如Oracle;SQLServer默认级别为:Read committed


    四:修改隔离级别:

    1:全局修改;my.cnf

    1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
    2 [mysqld]
    3 transaction-isolation = REPEATABLE-READ #mysql默认就是这个
     2:当前修改,重启mysql后失效

    mysql> set tx_isolation='read-committed';

     文章出自我的独立博客:http://blog.daozys.com/goods_89.html

    展开全文
  • 事务并发可能产生的问题:(在不考虑事务隔离的情况下)脏读:脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了...

    事务并发可能产生的问题:(在不考虑事务隔离的情况下)

    脏读:

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

    不可重复读:

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

    幻读/虚读:

    是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

    不可重复读与幻读的区别:

    不可重复读的重点是修改,同样的条件,你读取过的数据,再次读取出来发现值不一样;(主要在于update)

    幻读的重点在于新增或者删除,同样的条件,第 1 次和第 2 次读出来的记录数不一样。(主要在于insert和delete)

    MVCC(多版本并发控制)

    MVCC就是为了实现读写冲突不加锁

    多版本并发控制,顾名思义,在并发访问的时候,数据存在版本的概念,可以有效地提升数据库并发能力,常见的数据库如MySQL、MS SQL Server、IBM DB2、Hbase、MongoDB等等都在使用。

    简单讲,如果没有MVCC,当想要读取的数据被其他事务用排它锁锁住时,只能互斥等待;而这时MVCC可以通过提供历史版本从而实现读取被锁的数据的历史版本,从而避免了互斥等待。

    InnoDB采用的MVCC实现方式是:在需要时,通过undo日志构造出历史版本。

    事务的隔离级别:

    为了解决上面说的并发所导致的问题,就需要设置数据的隔离级别,事务的隔离级别是通过锁、MVCC的方式实现

    Read uncommitted:读未提交,最低级别,以上情况都无法保证

    实现机制:在前文有说到所有写操作都会加排它锁,那还怎么读未提交呢?因为排他锁会阻止其它事务再对其锁定的数据加读或写的锁,但是对不加锁的读就不起作用了。READ UNCOMMITTED隔离级别下, 读不会加任何锁。而写会加排他锁,并到事务结束之后释放。

    Read committed:读已提交,防止数据脏读

    实现机制:事务中的修改操作会加排他锁,直到事务提交时才释放锁。读取数据不加锁而是使用了MVCC机制。因此在读已提交的级别下,都会通过MVCC获取当前数据的最新快照,不加任何锁,也无视任何锁(因为历史数据是构造出来的,身上不可能有锁)。

    为什么Read committed可以防止数据脏读:脏读是因为读取了其他事务未提交的数据,之后事务回滚了,导致脏读。但是如果在事务中修改数据时加了排他锁,并且直到事务提交时才释放排他锁,在这之间不允许其他事务查询此记录,所以不会出现脏读。

    为什么遗留了不可重复读和幻读问题:MVCC版本的生成时机: 是每次select时。这就意味着,如果我们在事务A中执行多次的select,在每次select之间有其他事务更新了我们读取的数据并提交了,那就出现了不可重复读,即:重复读时,会出现数据不一致问题,后面我们会讲解超支现象,就是这种引起的。

    Repeatable read:

    实现机制:READ COMMITTED级别不同的是MVCC版本的生成时机,即:一次事务中只在第一次select时生成版本,后续的查询都是在这个版本上进行,从而实现了可重复读。

    Serializable:

    实现机制:所有的读操作均为当前读,读加读锁 (S锁),写加写锁 (X锁)。采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读,这样就避免了幻影读问题。

    Serializable隔离级别下,读写冲突,因此并发度急剧下降,在MySQL/InnoDB下不建议使用。

    查看当前数据库隔离级别:

    show global variables like '%isolation%';

    MySQL数据库设置事务隔离级别:(设置数据库的隔离级别要在开启事务之前)

    set [global | session] transaction isolation level 隔离级别名称; 或 set tx_isolation='隔离级别名称'

    set session transaction isolation level read uncommitted; -- 设置read uncommitted级别

    set session transaction isolation level read committed; -- 设置read committed级别

    set session transaction isolation level repeatable read; -- 设置repeatable read级别

    set session transaction isolation level serializable; -- 设置serializable级别

    ADO.NET设置事务隔离级别:

    var tran = conn.BeginTransaction(IsolationLevel.ReadUncommitted)

    测试几种隔离级别:

    read uncommitted:

    打开两个会话,先后执行会话1、会话2中的代码

    会话1:

    set autocommit=0; -- 设置不自动提交

    update actor set first_name='fan' where actor_id=1; -- 将姓名修改为fan,不提交

    会话2:

    set session transaction isolation level read uncommitted; -- 将当前会话隔离级别设置为read uncommitted

    select * from actor where actor_id=1; -- 可以读取到会话1修改后的数据

    read committed:

    会话1:

    set autocommit=0;

    update actor set first_name='fan' where actor_id=1;

    会话2:

    set session transaction isolation level read committed; -- 将当前会话隔离级别设置为read committed

    select * from actor where actor_id=1; -- 会话2读取到的还是原来的数据,直到会话1提交后,会话2才可以读到修改后的数据

    再测试一下是否可以重复读:

    会话1:

    set session transaction isolation level read committed;

    set autocommit=0;

    select * from actor where actor_id=1; -- 先执行这个sql,查看结果。然后再执行会话2

    select * from actor where actor_id=1; -- 执行完会话2后再执行一次查询,对比两次结果是否一致

    会话2:

    update actor set first_name='fan' where actor_id=1; -- 将姓名修改为fan

    结果是会话1中两次查询结果不一致

    repeatable read:

    会话1:

    set session transaction isolation level repeatable read;

    set autocommit=0;

    select * from actor where actor_id=1; -- 先执行这个sql,查看结果。然后再执行会话2

    select * from actor where actor_id=1; -- 执行完会话2后再执行一次查询,对比两次结果是否一致

    会话2:

    update actor set first_name='fan' where actor_id=1; -- 将姓名修改为fan

    结果是会话1中两次查询结果一致

    serializable:

    会话1:

    set session transaction isolation level serializable;

    set autocommit=0;

    select * from actor where actor_id=1;

    会话2:

    update actor set first_name='fan' where actor_id=1;

    执行完会话1,此时会话1未提交,id=1的记录加了读锁,会话2执行update会被阻塞

    展开全文
  • 一、基础知识1) 使用事务级别ReadUnCommited 会产生脏读现像,意味着...不巧的是有个哥们过来读数据了,这个时候读到的就是未提交的值,如果后继工作一切正常,也没什么影响。一旦后面的代码执行中出错,就会产生...

    一、基础知识

    1)         使用事务级别ReadUnCommited 会产生脏读现像,意味着读取到的为UnCommited(未提交)的数据。怎么理解呢?在使用该隔离级别的事务开始后。更新了数据库某一行的数据,但是事务的工作量比较大,后续还有一大堆代码还没执行完呢。不巧的是有个哥们过来读数据了,这个时候读到的就是未提交的值,如果后继工作一切正常,也没什么影响。一旦后面的代码执行中出错,就会产生不一致的错误,适用于对事务极度自信的情况下,特点为可读不可改。关于不可改需解释一下,MS SQL中一条语句为最基本的执行单元了,如果一个事务中,对同条数据的更新语句未Commited的情况下,其它事务是需要等待的。

    2)         使用事务级别ReadCommited 会消除脏读现像,意味着读取到的为Commited(已提交)的数据。在使用该隔离级别的事务开始后,除了该事务其它的查询均会一直等待直到该事务提交。特点为不可读不可改,

    3)         使用事务级别Repeatable Read,可重复读。它不会像ReadCommited一样阻止Select查询,但它会阻止Update语句。使用该隔离级别的事务开始后,会阻止其它事务更改查询。但依然可以新增数据。

    4)         使用事务级别Serializable 最严的一种了,与Repeatable Read相比就是在这种级别下不能新增数据。

    5)         下表为简单说明

    其中增删除改查为其它事务中对已在事务中的数据行进行增删改查的可能行性,其中删,改,查操作多个事务中的同一条数据。√指该隔离级别下操作可未被阻塞可立即响应。

    隔离级别

    增(其他事务)

    删(其他事务)

    改(其他事务)

    查(其他事务)

    脏读

    读提交

    可重复读

    幻影读

    数据过期

    ReadUnCommited

    ×

    ×

    ×

    ×

    ReadCommited

    ×

    ×

    ×

    ×

    ×

    ×

    Repeatable Read

    ×

    ×

    ×

    Serializable

    ×

    ×

    ×

    ×

    ×

    二、C#中的事务

    1)         ADO.NET中的事务与EF中的事务,它们是一类事物。可以说是同一个东西,均为封装了 SQL语句中的 Begin Tran Commit等。

    2)         分布式事务TranscationCope需引用System.data.Transcations.dll才能使用

    3)         分布式事务与事务二者区别,主要区别在于前者用于一个数据连接中控制数据一致性,后者在多个数据库连接中控制数据一致性,如果不能理解,可以记忆为一个数据库使用事务用前者,多个数据库中使用事务用后者,如果在一个数据连接中使用TranscationCope,可以把它为理解为简化版的事务,因为它只有Complete方法。

    4)         注意TranscationCope进行多事务协调时需安装与设置MSDTC组件。

    5)         并行事务:指在同一个DBConnection中启用二个事务,这个不被ADO.NET与EF支持(目前),如果程序运行过程中出现了 Connection不支持并行事务的时候,检查一下是否在一个数据库连接中使用了二个事务。

    三、事务的应用与验证。

    1)         下面依次验证(末完成)

    验证时注意事项:连接字符串中设置 Pooling = False 既关掉数据连接池,特别是多次测试之后会有点小问题干扰结论。;如果需要验证多个事务进行引发的异常还是阻塞进程,需要把超时时间设置为更多一些超过程序预计运行时间。

    原文:http://www.cnblogs.com/zyug/p/4827645.html

    展开全文
  • 一、基础知识 1) 使用事务级别ReadUnCommited 会产生脏读现像,意味着读取...不巧的是有个哥们过来读数据了,这个时候读到的就是未提交的值,如果后继工作一切正常,也没什么影响。一旦后面的代码执行中出错,就会...
  • 本场 Chat 为大家总结了数据库七大并发事务处理模式设计: 读未提交 读已提交(基于锁) 可重复读(基于锁) 可串行化(基于锁) 读已提交(基于 MVCC) SI SSI 当前内容版权归码字科技所有并授权显示,盗版必究...
  • Mysql:事务的隔离级别

    2019-04-01 19:32:15
    一个事务读取了另一个事务未提交的数据。 列如:事务A和事务B并发执行时,事务A更新后,事务B查询到事务A尚未提交的数据, 此时,事务A回滚,则事务B读取到的数据就是脏数据(事务B读取事务A未移交的数据) 怎么...
  • MySQL的事务隔离级别与实现原理# 1.MySQL事务并发时可能出现的情况mysql事务并发的时候回出现三种情况 脏读(Dirty Read)、不可重复读(Non-Repeatable Read)、幻读(Phantom Read)# 1.1脏读一个事务读到了另外一个事务...
  • 展开全部SQL标准定义了4类隔离级别,包括了一些具体规则,32313133353236313431303231363533e58685e5aeb...Read Uncommitted(读取未提交内容)在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离...
  • 我们都知道 MySQL 是支持多事务并发执行,否则一个事务一个事务串行化处理,用户都要砸键盘了。...最耳熟能详就是,事务可以分成 4 个隔离级别:读未提交、读已提交、可重复读、串行化。用最多就是 Inno...
  • 这个"网上"说法本身就是错误,所以必然无法复现.MyISAM是非事务存储引擎,每次写入都会有表级别排他锁,不会涉及这些可见性问题,而InnoDB是事务存储引擎,读未提交以上隔离级别下也必然会保证隔离性,前文我已经...
  • 我们都知道 MySQL 是支持多事务并发执行,否则一个事务一个事务串行化处理,用户都要砸键盘...最耳熟能详就是,事务可以分成 4 个隔离级别:读未提交、读已提交、可重复读、串行化。用最多就是 InnoDB 默认...
  • 处理事务怎么做 1、事务内部提交:告诉spring使用哪种数据库访问事务类型 2、什么样的事务: (1)事务的隔离级别:有4个隔离级别: READ_UNCOMMITTED:读未提交 READ_COMMITTED:读已提交 REPEATABLE_READ:可重复读。...
  • 最耳熟能详就是,事务可以分成 4 个隔离级别:读未提交、读已提交、可重复读、串行化。用最多就是 InnoDB 默认隔离级别——是可重复读REPEATABLE READ,一般会叫它缩写「RR」。 ???? 到这里,不知
  • MyBatis获取Id自增长

    千次阅读 2011-07-16 16:23:54
    当遇到要保存一个对象同时要保存多个依赖对象值时,我们需要在同一个事务中进行处理,那么就需要拿到前一个被依赖对象ID值,但是事务未提交我们怎么去拿ID呢?下面例子是mybatis对此类需求支持:映射文件: ...
  • mysql X00

    2020-01-13 15:05:41
    在MySQL 5.5.3以后的版本中,未提交的事务一定会堵塞DDL请求(据说5.6.6以后的版本做了相关的优化,未做测试暂且不提) DDL在等待metada lock的过程中肯定会堵塞后续的DML请求,也有可能堵塞后续的SELECT请求(需要...
  • 恢复策略:重做(REDO)所有已提交的事务(3)介质故障;指外存故障。装入数据库发生介质故障前某个时刻的数据副本,重做自此时始的所有成功事务,将这些事务已提交的结果重新记入数据库。(4)计算机病毒:一种人为...
  • A事务读取了B事务还没有提交的数据,而这个数据属于B事务处理过程中产生的脏数据,可能只是临时状态。怎么理解这个临时呢? 当B因为后续的异常导致回滚 B后续的操作中还有对这个数据的修改 那
  • SQLite数据库(下)

    2016-07-05 17:53:30
    学习完上一节,关于Android中SQLite基本操作,你就已经掌握了,而在本节我们将会学习 一些稍微高级一点东西,数据库事务怎么将大二进制数据存储到数据库中,以及版本升级时 数据库如何处理!(二)又见...
  • seata1.3.0.zip

    2020-07-23 15:21:24
    首先,seata库下面的事务处理表里面有遗留事务处理记录,然后你会发现tc-server端日志里面会持续刷上述日志,tc-server会持续的尝试回滚该事务。最遗憾的是:哪怕客户端服务重启,也不会回滚该事务!!! 不过还好...
  • 的事务处理。而在这两种不同的使用方式中, 语言的语法结构是一致的,从而为用户使 第1章结构化查询语言简介 用提供了极大的方使性和灵活性。 高度非过程化 语言是·种非过程化语言。用户只需指出“做什么”,而...
  • 8.4 不好的事务习惯 263 8.4.1 在循环中提交? 264 8.4.2 使用自动提交? 270 8.5 分布式事务 271 8.6 自治事务 273 8.6.1 自治事务如何工作? 273 8.6.2 何时使用自治事务? 276 8.7 小结 279 第9章 redo与undo...
  • 8.5 不好的事务习惯 255 8.5.1 在循环中提交 255 8.5.2 使用自动提交 261 8.6 分布式事务 261 8.7 自治事务 263 8.7.1 自治事务如何工作 264 8.7.2 何时使用自治事务 265 8.8 小结 268 第9章 redo与undo 269...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    开发者提交的应用开发数目远超游戏开发。 任务2 软件开发计划 任务2 软件开发计划 软件开发计划 软件开发计划 问题定义-案例 项目可行性 软件开发计划 软件开发计划 可行性分析-案例1 炫铃项目的...
  • 1.3.1 联机事务处理和决策支持系统数据库 6 1.3.2 开发、测试和产品数据库 7 1.4 培训和认证 7 1.4.1 培训 7 1.4.2 认证 8 1.4.3 Oracle DBA资源和组织 10 1.4.4 Oracle示例 11 1.4.5 Oracle...
  • 组件感知能力:在已经打包apk包中进入调试模式,可查看到组件版本和已包含或包含必要组件。 组件版本冲突打包能力:单个组件不同版本都可以参与打包,且安装之后正常运行,能够查看单个组件多个版本,支持...
  • 13. 北邮学硕和专硕学费和奖学金政策是怎么规定? 复试篇 分数线 1. 分数线简介 2. 国家线 2.1 2016年国家线 2.2 2017年国家线 2.3 2018年国家线 2.4 2019年国家线 3 校线 4 院线 4.1 计算机...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

未提交的事务怎么处理