使用事件进行同步、事务隔离级别为脏读 还是出现事务死锁问题

问题描述

整个程序就两个业务处理,如下:(1)一个纯查询业务:QueryData(){多个表查询操作······}(2)一个数据更新业务:publicstaticAutoResetEventmEvent=newAutoResetEvent(true);//静态的全局事件对象,用于事务并发同步控制,保证任一时刻只有一个事务得到执行。UpdateData(){//数据更新业务mEvent.WaitOne();//等待信号SqlTransactiontran=BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);//启用事务,并把隔离级别设置为未提交读,即允许脏读,目的是使查询业务不被阻塞。SqlCommanddbCommand=null;dbCommand=newSqlCommand(sSQL,m_Connect);dbCommand.Transaction=m_tran;//使用事务执行各种更新操作······mEvent.Set();//释放事件}(3)运行过程还是出现了死锁:用profier捕捉发现,当同时有一个客户端执行数据更新业务UpdateData、五个客户端执行查询业务QueryData的情况下会出现事务死锁。问题:(1)整个程序就只有一个事务,何来的事务争用资源导致死锁?难道查询业务也自动变成了事务?(2)就算查询业务自动变成了事务,那么,更新业务中事务隔离级别设置为脏读,难道这个设置不起作用?请高手指点,万分感谢!

解决方案

解决方案二:
对于这问题你列出的这些代码显然无法说明任何问题,更新使用的是排他锁,查询使用的是共享锁,排他锁是无法和其他锁共存,那么当你的查询无法正常完成并释放共享锁时,你的update就无法申请到排它锁。但死锁的问题并不一定是查询的共享锁导致,所以这么点代码是很难说明问题的
解决方案三:
允许脏读么直接在sql里写with(nolock),你居然用事务
解决方案四:
你这五个客户端是跨进程了吧,存在于不同机器的不同进程?AutoResetEvent同步事件无法用于跨进程的进程同步,所以死锁了,我猜是这样
解决方案五:
涉及到的表是否都有主键?update的时候是否会更新主键涉及到的列?这些都可能导致select时死锁。如版主所说,允许脏读的话查询时时加上with(nolock)就好。select....from...with(nolock)where....
解决方案六:
非常感谢大家!我这个是网站项目,事件对象是全局的。目前也没有其他办法了,先试试版主的办法看看。

时间: 2024-09-19 10:14:05

使用事件进行同步、事务隔离级别为脏读 还是出现事务死锁问题的相关文章

SQL Server事务隔离级别详解

SQL Server事务隔离级别详解 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述      隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一定的影响作用. 步骤 事务隔离级别通过影响读操作来间接地影响写操作:可以在回话级别上设置事务隔离级别也可以在查询(表级别)级别上设置事务隔离级别.事务隔离级别总共有6个隔离级别:READ UNCOMMITTED(未提交读,读脏),相当于(NOLOCK)

MySQL事物(一)事务隔离级别和事物并发冲突

数据库的操作通常为写和读,就是所说的CRUD:增加(Create).读取(Read).更新(Update)和删除(Delete).事务就是一件完整要做的事情.事务是恢复和并发控制的基本单位.事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少.事务在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序.是数据库中各种数据项的一个程序执行单元.事务是用户定义的一个操作序列(多个表同时读写).这些操作要么都做,要么都不做,是一个不可分割的工作单位.事务通常是以BEG

spring mybatis 事务隔离级别

问题描述 spring mybatis 事务隔离级别 我数据库的主键是单独存放在一张公共表里面的,里面的数据如下: 表名|当前值 table1|20 然后通过一个存储过程来每次获取递增. 我配置的是service级别的事务.我在一个service里面把要插入的数据封装到List里面,多次调用自增长主键存储过程,发发现每次获取的都是相同的值.按理说我每次调用数据库里面的值就会从20变成21,依次类推.是不是默认的事务隔离级别是不提交我的事务.等全部执行成功之后才提交事务? 我应该配置成什么隔离级别

MySQL数据库事务隔离级别介绍(Transaction Isolation Level)_Mysql

数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 复制代码 代码如下:  #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. [mysqld] transaction-isolation = REPEATABLE-READ 这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级

MySQL事务隔离级别介绍及设置

READ UNCOMMITTED(未提交) 即使没有提交,对其它事务也可见.未提交的数据会引起脏读(Dirty Read). 测试流程: 1.A设置read-uncommitted, start transaction 2.B执行start transaction,修改一条记录, 3.A查询记录,得到了以为正确的记录 4.B回滚. 问题:A读到了B没有提交的记录,也就是脏读. READ COMMITTED(提交读) 一个从开始直到提交之前所做的任何修改对其它事务都是不可见的.两次同样的查询可能会

MSSQL与Oracle数据库事务隔离级别与锁机制对比_oracle

一,事务的4个基本特征 Atomic(原子性): 事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要 么全部成功,要么全部失败. Consistency(一致性): 只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初 状态. Isolation(隔离性): 事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正 确性和完整性.同时,并行事务的修改必须与其他并行事务的修改 相互独立. Durability(持久性): 事务结束后,事务处理的结果必须能够得到固化. 以上属于废话

【mysql】官方的SQL事务隔离级别文档

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read). Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的

MySQL事务隔离级别详解(转)

原文: http://xm-king.iteye.com/blog/770721 SQL标准对事务定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销.实际中,最常用的级别为Read Committed(读取提交内容).Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交

事务隔离级别小记

事务的四个属性:原子性(atomicity).一致性(consistency).隔离性(isolation)和持久性(durability). 1.原子性(Atomic)     最重要的原则,也是最容易理解的原则.被事务管理的所有方法,要么一起被提交,要么一起回滚. 2.一致性(Consistency)     事务在系统完整性中实施一致性,如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于新有效状态.如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态. 3.