串行等价化 事务 并发 加锁 死锁

原创 2012年03月22日 21:21:22

        串行等价性,满足串行等价性的事务,可以让CPU在不同事务间切换,轮有执行。这样的当事务中含有需要长时间访问磁盘的操作时,就可以执行其他事务,提供资源利用率。同时对于短事务可以降低响应时间。

        事务的串行等价性,指事务所含指令交叉执行的结果与串行一个一个执行结果似乎一样的。

    事务具有串行等价的充分必要条件,如果不同事务访问的资源有重叠,含有冲突操作时,那么不同事务访问资源的顺序必须一样。

        比如: 事务A,先访问i,再访问j资源;而事务B,先访问j,再访问i资源。访问还是冲突的(如读写冲突、写写冲突),那事务A与事务B将不满足串行等价。这样就无法实现CPU在不同事务间来回切换执行。

        对于不满足串行等价的事物,服务器可以通过串行化对象访问来达到事物的串行等价

        这就好比两个线程访问资源是冲突的,那么我就加锁强制两个线程串行的访问资源。

        不同人编写的事务不同,访问的资源不同,CPU如何在这些事务的指令上切换也是随意的,那么怎么能保证这些事务执行的结果是对的呢。

        简单的做法是加互斥锁,一个对象一把锁,一个时刻只有一个人可以访问、修改该对象,同时直到事务中所有的操作执行完了才一并释放锁。这就是两阶段加锁。

        加锁必然降低并发,那么就通过修改锁,提出了读锁、写锁分离、层次锁等概念来减低锁的粒度、锁强度从而增强并发。比如一个队列,在队列头部插入,在队列结尾删除。如果只有一把锁,那么插入和删除就不能并发执行。如果有两把锁将插入和删除区分开,则会减少冲突,提高并发。

       有加锁必然就有死锁的情况出现。那么死锁与什么有关?  串行等价性到底有什么作用?

        1.  串行等价性让计算资源可以充分利用,不用一个事务接一个事务的执行。

        2.  但运行调度和切换执行事务操作后如何保证事务的正确性,特别是当不同事务访问相同资源时,常用方法就是加锁。

        3. 加锁就有死锁情况出现,死锁与加锁、解锁的调用方式有关。比如同时等待多个锁,同时释放多个锁;还是对一个对象加锁、释放,然后再一个对象加锁、释放;这些方式的不同就会引发死锁。

mysql锁研究系列四(事务在并发情况下避免超卖)

我们在做电商的时候会考虑到一个问题,如果此时库存就剩一个,而来了两个并发同时下单,如何避免库存超卖? 先贴一段代码: beginTranse(开启事务) $sql = "select ...
  • qq_21267705
  • qq_21267705
  • 2015年08月24日 19:14
  • 1407

数据库事务原理及并发、死锁

1. 什么是数据库事务 1.1 数据库事务是指作为单个逻辑工作单元执行的一系列操作(SQL语句)。这些操作要么全部执行,要么全部不执行。 1.2 通过ACID实现数据库事务模型 1.2.1 原子...
  • huwenhu2007
  • huwenhu2007
  • 2017年06月25日 16:35
  • 1421

MySQL读书笔记-事务,隔离级别,死锁

事务事务,就是一组原子性的SQL查询。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询;如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。即,事务内...
  • delphiwcdj
  • delphiwcdj
  • 2016年07月12日 22:12
  • 918

事务及并发控制(锁,死锁,恢复)

1.事务(transaction)的定义:指访问并可能更新数据库中各种数据项的一个程序执行单元(unit) 包括:SQL语句的集合,存储过程体,高级语言的事件 2.事务的状态:ac...
  • zjw123king
  • zjw123king
  • 2016年04月01日 20:38
  • 1407

SqlServer 并发事务:死锁跟踪(一)简单测试

-- 测试代码 -- DROP TABLE Test CREATE TABLE Test ( id INT, name VARCHAR(20), info VARCHAR(20), ) CR...
  • kk185800961
  • kk185800961
  • 2014年11月25日 20:25
  • 3209

并发程序中如何规避死锁

通常意义上的死锁是由于不同线程(也可能是进程或者虚拟线程)请求锁的顺序不同造成的。google如何避免死锁,随便一篇文章都会告诉你只要按照同样的顺序请求锁,就可以避免死锁。这可能适用于大部分并发应用。...
  • runyon1982
  • runyon1982
  • 2015年10月10日 09:19
  • 1215

fmdb中databasequeue的使用,避免死锁

在ios开发中,大家很可能会用到这样一个数据库封装:fmdb. 该封装相比coredata来说有他自己的优势:接口清晰,设计简单,符合规范,多线程情况下使用databasequeue来进行操作也很方...
  • openglnewbee
  • openglnewbee
  • 2014年05月21日 11:25
  • 7921

oracle数据库事务并发操作

(1)丢失数据修改当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。(2)读“脏”...
  • qq_16209077
  • qq_16209077
  • 2016年08月11日 10:58
  • 14097

深入理解Mysql——锁、事务与并发控制(辟谣)

mysql用的时间也不短了,但从没有做过总结。今天就来总结一下吧mysql服务器逻辑架构每个连接都会在mysql服务端产生一个线程(内部通过线程池管理线程),比如一个select语句进入,mysql首...
  • lemon89
  • lemon89
  • 2016年05月23日 00:21
  • 5977

并发调度的可串行性

计算机系统对并发事务中并发操作的调度是随机的,而不同的调度可能会产生不同的结果,那么哪个结果是正确的,哪个是不正确的呢?     如果一个事务运行过程中没有其他事务同时运行,也就是说它没有受到其他事...
  • panxiqie___
  • panxiqie___
  • 2014年08月28日 15:40
  • 1728
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:串行等价化 事务 并发 加锁 死锁
举报原因:
原因补充:

(最多只允许输入30个字)