`
LuisFigo
  • 浏览: 38285 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据库事务与并发和锁机制

    博客分类:
  • JDBC
阅读更多

      软件开发中,事务与并发一直是个很头疼的问题,其中包括操作系统的任务调度,Java多线程并发死锁问题,当然数据库也是绕不过去的。下面就来详细解析数据库事务与并发产生的原因、过程及其解决办法。

 

      一个事务是由一系列数据库操作构成。就并发性和恢复控制的角度来看,其具有“原子性”,在一个事务中如果一个操作失败,就必须撤销所有操作。当多个事务同时访问数据库资源时,可能会造成并发问题,这需要通过事务的隔离级别来控制。
数据库事务必须具备ACID特征,即原子性、一致性、隔离性和持久性。

 

      在编写数据库应用程序时向数据库系统声明事务后,数据库会自动保证ACID特性。数据库系统支持两种事务提交方式即手动提交和自动提交。

通过JDBC驱动程序可以控制以下几个事务内容:
1、connection.setAutoCommit(false) — 事务的开始边界
2、connection.setSavePoint("point_1") — 事务的保持点
3、connection.commit() — 正常的事务提交
4、connection.rollback() — 撤销事务

 

      当多个事务并发访问数据库中相同资源时,会出现以下几种问题:第一类丢失更新、脏读、虚读、不可重复读(推荐看下孙卫琴《精通Hibernate: Java对象持久化技术详解》十二章)。

现在来解释一下上面的几种问题:
1、第一类更新丢失
   这是事物隔离级别最低时出现的问题,既不发出共享锁,也不接受排它锁。两个事务更新相同的数据资源时,如果一个事务被提交,一个事务被撤销,则提交的事务所做的修改也将被撤销。
2、脏读
   第二个事务查询到了第一个事务未提交的更新数据,第二个事务在查询结果上继续操作,但是第一个事务撤销所作的更新,这会导致第二个事务操作脏数据。
3、虚读
   虚读是一个事务查询到另一个事务已提交的新插入的数据引起的。比如这样同一事务两次读取同一表的行数就会发现不一致。
4、不可重复读
   同虚读类似,不可重复读是由一个事务查询到另一个事务已提交的对数据的更新引起的。

 

      针对以上几种问题,数据库系统提供了四种隔离级别来控制事务的并发问题(隔离级别与并发性能此消彼长):
1、READ UNCOMMITTED - 读不提交 隔离级别中最低的,没有对并发进行控制,会出现所有情况
2、READ COMMITTED — 读已提交   解决了脏读
3、REPEATABLE READ - 可重复读  在READ COMMITTED基础上 解决了不可重复读的问题
4、SERIALIZABLE — 可串行化     在REPEATABLE READ基础上解决了虚读的问题,是隔离级别中最高的,此时如果两个事务同时访问相同数据,则只能是其中一个事务先访问,当第一个事务结束时,另一个事务才能继续执行操作。

      至此,数据库的事务和并发已经露出眉目,下面将揭开最后的面纱 — 数据库的锁机制。
      数据库系统采用锁机制来实现事务的隔离性。各数据库采用的锁的理论基本上是一致的(推荐看下《数据库系统概论》第八章 并发控制),只是具体实现有所不同。

 

      按照封装程度,锁分为:共享锁、独占锁和更新锁。
1、共享锁
     共享锁用于读数据操作,它是非独占的,允许其他事务同时读取锁定的资源,但不允许其他事务更新它。
加锁条件:当一个事务执行select语句时,数据库系统会为这个事务分配一把共享锁,来锁定被查询的数据。
解锁条件:默认情况下,数据被读取后,数据库系统立即解除共享锁。
兼容性:如果数据资源上放置了共享锁,还能再放置共享锁和更新锁。
2、独占锁
     独占锁也叫排他锁,使用与修改数据的场合。它锁定的资源,其他事务不能读取也不能修改。
加锁条件:当一个事务执行insert、update或delete语句是,数据库会放置一把排他锁。
解锁条件:独占锁一直到事务结束才能被解除。‘
兼容性:不能去其他锁兼容。
3、更新锁
      加锁条件:在更新操作的初始化阶段来锁定可能要修改的资源,这可避免使用共享锁做成的死锁现象。
兼容条件:更新锁与共享锁是兼容的
下面以一条update语句执行过程为例阐述一下更新锁的作用:
update account set balance = 1000 where id = 10;
使用共享锁,更新数据操作分两步:
1、获得一个共享锁,读取account表中id为10的记录
2、将共享锁升级为独占锁,再执行更新操作
此种情况下,很容易产生死锁问题。

使用更新锁,更新数据的操作分两步:
1、获得一个更新锁,读取account表中id为10的记录
2、将共享锁升级为独占锁,再执行更新操作

      我们在编写应用程序时,也会用到锁,这就是所谓的悲观锁和乐观锁
乐观锁:完全依靠数据库的事务隔离级别来自动管理锁的工作
悲观锁:悲观锁对事态很悲观,当事务访问数据资源时,先要锁定资源
Oracle、SqlServer和Mysql都支持select ... from update这样的语句,以上语句显示指定独占锁来锁定查询的记录。
执行该条查询语句的事务持有这把锁,直到事务结束才会释放锁。

 

      许多数据库系统能够自动定期搜索和处理死锁问题。理解了死锁的概念,在应用程序中可以采用一些方法来避免死锁,比如合理安排表访问顺序和使用短事务等。

 

2
1
分享到:
评论
1 楼 xjxjsky 2012-05-23  
言简意赅。

相关推荐

    数据库事务、hibernate悲观锁和乐观锁

    数据库事务是数据库操作的核心组成部分,它确保了数据的一致性和完整性。事务是由一系列数据库操作组成的逻辑单元,这些操作要么全部成功执行,要么全部不执行,遵循ACID(原子性、一致性、隔离性和持久性)原则。 ...

    数据库并发处理控制 pdf

    - **事务并发执行带来的问题**:当多个事务同时对同一数据进行操作时,如果没有适当的控制措施,可能会导致数据不一致的问题,破坏数据库的一致性。因此,数据库管理系统(DBMS)需要提供并发控制机制来确保数据的一致...

    MS SQL Server数据库事务锁机制分析

    事务隔离级别也是SQL Server中控制锁行为的关键因素,不同的隔离级别(如读未提交、读已提交、可重复读和串行化)会影响事务看到的数据版本和锁的使用。例如,较高的隔离级别可能会使用更多的锁来防止脏读、不可重复...

    06-VIP-深入理解Mysql事务隔离级别与锁机制.pdf

    深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库...在实际应用中,需要根据不同的应用场景选择合适的事务隔离级别和锁机制,来解决多事务并发问题,提高数据库的并发访问性能和数据的一致性。

    数据库并发控制机制——事务

    这是一个关于银行的数据库的处理,模仿的是从账户1转账给...那就需要用到事务,如果没有一起执行,就回滚。这个代码比较简单,希望对大家有帮助,自己建立一个数据库bank,在里面建立一个表Account,两属性:Id,money.

    数据库安全事务与锁数据库安全事务与锁

    在SQL Server 2000中,事务和锁机制对于保证数据库系统的并发操作和数据安全性至关重要。 1. **事务**: 事务是数据库操作的基本单元,它包含一组数据库操作,这些操作要么全部成功(提交),要么全部失败(回滚)...

    [数据库事务与锁]详解七 深入理解乐观锁与悲观锁

    ### 数据库事务与锁:深入理解乐观锁与悲观锁 #### 一、并发控制的重要性 在多用户系统中,特别是数据库管理系统(DBMS)中,确保数据的一致性和事务的隔离性至关重要。当多个事务同时访问同一数据时,如果不加以...

    数据库事务及锁机制面试题

    ### 数据库事务及锁机制详解 #### 一、事务的概念与特性 事务是数据库系统中一组操作的集合,用于确保数据的一致性和完整性。在事务处理中,事务被视为一个不可分割的工作单元,其中包含的操作要么全部成功,要么...

    数据库并发事务处理机制详解与代码实践

    数据库并发事务处理机制是数据库管理系统的关键组成部分,它涉及到事务的基本概念、并发访问的挑战以及隔离级别和并发控制技术等多个方面。理解和掌握这些知识点,对于数据库设计和优化至关重要。 首先,事务是...

    SQL server锁的机制

    SQL Server的锁机制是数据库管理系统中用于控制并发访问的关键组件,确保数据的完整性和一致性。在SQL Server中,锁用于管理事务之间的数据访问,防止数据的不一致性,并提高多用户的并发性。以下是对SQL Server锁...

    数据库中事务和锁.ppt

    在数据库管理系统中,事务和锁是两个至关重要的概念,它们主要用于保证数据的一致性和完整性,以及在多用户环境下的并发访问控制。 事务是数据库操作的基本单位,它封装了一组数据库操作,这些操作要么全部执行,...

    数据库中锁机制的学习

    数据库中的锁机制是确保数据一致性、并发控制和事务隔离的重要机制。在多用户环境中,当多个用户同时访问和操作同一份数据时,可能会引发数据冲突和不一致。为了解决这些问题,数据库系统引入了锁来协调并发操作。...

    浅谈数据库中事务处理和并发控制技术

    本文将详细介绍数据库事务处理和并发控制技术的概念、特性和实现机制。 一、事务处理概念 事务处理是数据库管理系统中的一个基本概念,指的是一系列的数据库操作,是数据库应用程序的基本逻辑单元。事务处理技术是...

    浅析SQL Server数据库事务锁机制.pdf

    总之,SQL Server数据库事务锁机制涉及到锁的概念、锁的多粒度性、锁升级、锁的模式和兼容性、锁冲突及防止方法等多个方面。数据库管理员和开发人员需要深入理解这些知识点,以合理地管理事务锁,确保数据库操作的...

    MSSQLServer数据库事务锁机制分析.docx

    ### MSSQLServer数据库事务锁机制分析 #### 一、引言 锁机制是数据库系统中一个非常关键的概念,尤其在多用户环境中,它确保了数据的一致性和完整性。不同的数据库管理系统(DBMS)虽然有着相似的基本锁理论,但在...

    数据库系统的并发控制-PPT课件.ppt

    并发控制是指数据库系统中多个事务并发执行时,如何避免或解决由于并发操作而引起的数据不一致和不正确性问题。数据库系统的并发控制机制旨在确保事务之间的可串行性,使得事务可以并发执行而不影响彼此的正确性。 ...

    数据库并发控制的基本方法

    - **可串行化调度**:虽然事务并发执行,但是其效果等同于串行调度。 #### 五、冲突可串行性 冲突可串行性是一种特殊的可串行化调度,其中只考虑了事务间的冲突操作。如果一个调度中所有的冲突操作都可以重新排列...

    数据库事务总结 数据库事务总结

    ### 数据库事务总结 #### 一、事务的基本概念与特性 **事务**是数据库系统中的一个逻辑工作单元,它由一系列的操作组成,这些操作要么都完成,要么都不完成,以此来保证数据的一致性和完整性。 #### 二、事务的...

    软考系分之数据库事务并发与事务加锁

    ### 数据库事务并发与事务加锁 #### 一、数据库事务基本概念 在数据库领域,事务(Transaction)是由一系列操作组成的逻辑工作单元。事务具备四个关键特性:原子性(Atomicity)、一致性(Consistency)、隔离性...

    数据库PPT关于并发控制

    数据库并发控制是数据库管理系统中的关键组成部分,其目的是确保在多用户环境下,多个事务同时执行时,数据...在并发环境中,通过锁机制和规范化设计,可以确保数据库在多事务并行执行时仍然保持数据的正确性和一致性。

Global site tag (gtag.js) - Google Analytics