数据库事务及其EF中如何处理事务

一、基础知识

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 既关掉数据连接池,特别是多次测试之后会有点小问题干扰结论。;如果需要验证多个事务进行引发的异常还是阻塞进程,需要把超时时间设置为更多一些超过程序预计运行时间。

时间: 2024-10-11 01:35:13

数据库事务及其EF中如何处理事务的相关文章

EntityFramework监控sql和EntityFramework中的事务

继续上篇:EntityFramework和EntityFramework.Extended使用说明——性能,语法和产生的sql 1.监控sql 上篇中的sql监控采用的是 Microsoft SQL Server Management Studio中工具->profiler去监控的.当然,Express版本是没有此功能的.如果您使用不了profiler或者觉得不方便,那么,给出监控sql的第二方案. 找到的资料是英文的,还好,容易理解.原文链接:https://blog.oneunicorn.c

数据库中的事务和并发问题探讨

数据库中的事务和并发问题探讨 引子 最近有同事写了段代码,负责创建订单的逻辑,代码审查时发现可能会有并发的问题.同事并不认同,他认为他的逻辑是写在存储过程中的,应该没有问题. 代码的逻辑大概是(伪代码): begin transaction if 查询到客户存在进行中的订单 rollback transaction if 查询到设备存在进行中的订单 rollback transaction 插入订单 commit transaction 下面针对这个逻辑进行分析,为什么这个事务会出现并发问题.

Spring中的事务与数据库中的锁关系

本文只先简单的介绍下Spring中的事务与DB中锁的关系. 首先总结:Spring事务的实现本质上是使用的DB中的事务,而DB中的事务实现又主要依靠DB中的锁.所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁. 所以大家一定要厘清DB事务与DB各种锁的原理与概念.后续我也研究一下DB锁,并结合具体的生产环境监控数据来谈谈. <以下是转载部分内容.主要是Spring事务的使用方式.隔离级别之类的> 那么事务的隔离级别与锁有什么关系呢?本人认为事务的隔离级别是通过锁的

4.事务提交过程,事务基本概念,Oracle中的事务生命周期,保存点savepoint,数据库的隔离级别

 事务提交过程 事务 基本概念 概念:一个或者多个DML语言组成 特点:要么都成功,要么都失败 事务的隔离性:多个客户端同时操作数据库的时候,要隔离它们的操作, 否则出现:脏读  不可重复读  幻读 Oracle默认情况下,事务是打开的 commit案例: SQL> create table t1(tid int,tname varchar2(20)); 表已创建. SQL> select * from tab; TNAME                          TABTYPE

EF 中事务的书写

在EF 中怎么使用事务? 这个问题纠结了我好久,直到有人跟我一起讨论,我和同事一起讨论查资料. 查的好多资料都是使用 using (TransactionScope scope = new TransactionScope()) { //具体代码内容 scope.Complete(); } 这种方式.而我在实际使用中是没法使用的. 所以我就一直找其他的方式,无意中看到某个网站的的database,然后我就采用了下面的方式: using (var dbContext = new TopOnline

Oracle 数据库中不同事务并发访问的问题

现象 以SQL/Helper为例,打开不同的SQL窗口,对同一个表格进行操作,如下所示. 窗口1:当执行更新任务.紧接着执行查询时获得一组查询结果.结果是对的. 窗口2:而在另外一个SQL查询窗口中执查询,却得到更新前的结果. 当关闭窗口1时,执行窗口2,发现出现正确的更新结果. 分析 初步分析是数据库的并发访问的问题.当在窗口1中执行更新操作,对数据表格的引用并未有消除,而是在数据库中产生了针对当前事务的副本结果.而窗口2所针对的查询还是旧的更新前的数据库原本.当关闭窗口1后,数据库中的表格被

EJB学习笔记之八(通俗易懂数据库中的事务)

1.事务概念 事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行. 通俗的说的话,事务就是一件事情,要么成功执行到底,要么回到起点,什么都不做. 事物的特性(ACID) 原子性(Atomicity):正如原子时自然界最小颗粒,具有不可再分的特征一样.意思就是说,咱的事务是一个逻辑单元,不能再拆分了,比如整体的执行. 一致性(Consistency):事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态.比如说银行之间的转账,从A账户向B账

什么是数据库的事务?MySql中哪些存储引擎支持事务?

什么是事务? 事务由一个或多个sql语句组成一个整体,如果所有的语句执行成功那么修改将会全部生效,如一条sql语句将销量+1,下一条再+1,倘若第二条失败,那么销量将撤销第一条sql语句的+1操作,只有在该事务中所有的语句都执行成功才会将修改加入到数据库中. 事务的特性 事务具体四大特性,也就是经常说的ACID 1. 原子性(Atomicity)  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. 

MySQL数据库中的事务特性

事务特性 事务具有4个特性:原子性.一致性.隔离性.持久性.这四个属性通常称为 ACID 特性. 原子性(atomicity):一个事务应该是一个不可分割的工作单位,事务中包括的操作要么都成功,要么都不成功. 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态.一致性与原子性是密切相关的. 隔离性(isolation):一个事务的执行不能被其他事务干扰.即一个事务内部的操作及使用的数据在事务未提交前对并发的其他事务是隔离的,并发执行的各个事务之间不能互相影响