`
morning2008
  • 浏览: 112883 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

(事物学习笔记一) 对于数据库事物的理解

 
阅读更多

对于数据库事物的理解

一、什么是事物

我们通常说的事物指的是数据库事物,是指访问数据库的一个操作序列。数据库系统通过事务集来完成对数据库的存取,事务的正确执行使得数据库从一种状态转换成另一种状态。

  事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。具体如下:

    1原子性(Atomicity)事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。

    2一致性(Consistency)几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。

    3隔离性(Isolation)事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。

    4持久性(Durability)对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

  在大多数情况下,通过执行COMMITROLLBACK语句来终止事务。当执行COMMIT语句时,自从事务启动以来对数据库所做的一切更改就成为永久性的了-- 即它们被写到磁盘。当执行ROLLBACK语句时,自从事务启动以来对数据库所做的一切更改都被撤销,并且数据库返回到事务开始之前所处的状态。不管是哪种情况,数据库在事务完成时都保证能回到一致状态。

二、数据库系统支持两种事务提交模式

    自动提交模式:每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。

    手动提交模式:必须由数据库客户程序显示指定事务开始边界和结束边界。

PL/SQL Devveloper等工具中有提供设置是否启用自动提交的功能。

三、事物并发问题

    对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没采取必要的隔离机制,就会导致各种并发问题,这些并发问题可归纳为以下几类:

    第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。

    脏读:一个事务读到另一个事务为提交的更新数据。

    虚读:一个事务读到另一个事务已提交的新插入的数据。

    不可重复读:一个事务读到另一个事务已提交的更新数据。

    第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新数据。

四、事物的隔离级别

  虽然事务通过确保对数据的更改仅在事务被成功提交之后才成为永久性的,从而提供了一般的数据库一致性,但还是须要用户或应用程序来确保每个事务中执行的SQL操作序列始终会导致一致的数据库。      

Serializable(串行化)一个事务在执行过程中完全看不到其他事务对数据库所做的更新。

    Repeatable Read(可重复读)一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。

    Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新。

    Read Uncomitted(读未提交数据):一个事务在执行过程中可以拷打其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。

     隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以有优先考虑把数据库系统的隔离级别设为Read Commited,它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

  当数据库系统采用read Commited隔离级别时,会导致不可重复读和第二类丢失更新的并发问题,可以在应用程序中采用悲观锁或乐观锁来避免这类问题。从应用程序的角度,锁可以分为以下几类:

  A.悲观锁:指在应用程序中显示的为数据资源加锁。尽管能防止丢失更新和不可重复读这类并发问题,但是它会影响并发性能,因此应该谨慎地使用。 

  B.乐观锁:乐观锁假定当前事务操作数据资源时,不会与其他事务同时访问该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作。应用程序采用版本控制手段来避免可能出现的并发问题。

五、悲观锁两种实现方式

  A.在应用程序中显示指定采用数据库系统的独占所来锁定数据资源

      例如: SQL语句:select ... for update

Hibernate中使用getload时如session.get(Account.class,new Long(1),LockMode,UPGRADE) 

  B.在数据库表中增加一个表明记录状态的LOCK字段

 当它取值为“Y”时,表示该记录已经被某个事务锁定,如果为“N”,表明该记录处于空闲状态,事务可以访问它。

六、乐观锁的实现方式

  利用Hibernate的版本控制来实现乐观锁。

  乐观锁是由程序提供的一种机制,这种机制既能保证多个事务并发访问数据,又能防止第二类丢失更新问题。

  在应用程序中可以利用Hibernate提供的版本控制功能来视线乐观锁,OR映射文件中的<version>元素和<timestamp>都具有版本控制的功能,一般推荐采用<version>

分享到:
评论

相关推荐

    数据库学习笔记.docx

    数据库学习笔记 MySQL数据库、Oracle数据库、JDBC基础、JDBC事物、数据连接池、dbUtils工具、Service层的事物处理

    数据库系统概论王珊第五版考试重点笔记.docx

    第一章 1.数据库的四个基本概念:数据、数据库、数据库管理系统、数据库系统。 数据:是数据库中存储的基本对象。描述事物的符号称为数据。 数据库:是长期存储在计算机内、有组织的、可共享的大量数据的集合。...

    sql学习笔记 包含实例

    本人培训期间的笔记。Oracle数据库包括标的建立,查询语句,事物管理,数据库设计等。

    数据库系统概论王珊第五版学习笔记.docx

    数据库系统概论王珊第五版学习笔记 第一章 1.数据库的四个基本概念:数据、数据库、数据库管理系统、数据库系统。 数据:是数据库中存储的基本对象。描述事物的符号称为数据。 数据库:是长期存储在计算机内、有组织...

    数据库oracle 学习笔记重点总结

    数据库,oracle ,强制删除,系列,事物控制,级联删除,sql,sqlpuls

    数据库学习笔记

    该笔记共有8天,从数据库的建表,到最后的java连接数据库,事物处理及银行转账的案例。可以满足初学者的需求,欢迎大家踊跃下载

    MySQL学习笔记、学习文档

    MySQL入Ar ]很简单学习笔记李国华.dox Oracle查看表结构.txt SQL作业代理禁用.txt sql.txt SQL-Transaction事物一起执行.txt sq和oracle的区别.txt sysobjects中type字段值意思txt W3School例句.txt 按照中文首字母...

    韩顺平oracle学习笔记

    韩顺平oracle学习笔记 第0讲:如何学习oracle 一、如何学习oracle Oracle目前最流行的数据库之一,功能强大,性能卓越。学习oracle需要具备一定基础: 1.学习过一门编程语言(如:java ,c) 2.最好学习过一门别的...

    数据库设计规范化反规范化.doc

    数据库设计规范化反规范化 ============================================================== *作者:bingghost(只是学习笔记 部分内容来源于网络) *邮箱:443530836@qq.com *贴吧:Radasm吧(按Ctrl+鼠标点击进入) ====...

    Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍

    1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中:复制代码 代码如下:ed_user = User(‘ed...

    人工智能读书笔记.doc

    人工智能读书笔记 今天读完X老师的《人工智能》这本书,整体感觉能收获的东西并不太多,或许是自己 对人工智能已经有些了解的原因,但是这本书仍然是关于人工智能方面比较科普的一本 书,对于我给这本书评分3星,...

    MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎详解

    和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离 。 这种架构可以...

    MySql基础命令详解(基础篇)

    MySql学习笔记(基础篇)-MySql基础命令详解 目录MySql学习笔记(基础篇)-MySql基础命令详解环境介绍Sql的分类DDL语句对库的操作对表的操作DML语言插入记录更新记录删除记录查询记录MySql语法规范 环境介绍 Centos7 ...

    MySQLDBA运维笔记.pdf

    1.1 数据库的种类...........................................................................................................6 1.1.1 关系型数据库介绍........................................................

    sanchitpasricha:这是我的投资组合,将在我的GIT HUB预览页面上提供。 此存储库包含README.md和配置文件上的横幅图像。 看看我的GIT HUB个人资料的概述页面

    每天学习新事物,并修改以前的事物以使其更好。 我在Qwiklabs平台上从事云计算工作。 每天都在上课,这只是我现在正在做的一天:) :high_voltage: 语言/技术: C C ++ Java Python HTML5 CSS3 JavaScript ...

    精选的命令行应用程序列表-Linux开发

    目录娱乐音乐社交媒体视频电影游戏图书开发文本编辑器Web开发移动开发数据库Devops版本Npm Boilerplate效率时间跟踪笔记和列表财务演示日历实用程序macOS终端共享实用程序网络实用程序主题和自定义Shell实用程序系统...

    思库教育PHP零基础培训+进阶课程+PHP项目开发实战 21G PHP零基础学习视频教程.txt

    ├&lt;思库教育一阶段&gt; │ ├1 div实现分块 给颜色;添表格.lxe │ ├1_html+css+js.zip │ ├10表单+input属性值.lxe │ ├2div如何平行显示.lxe │ ├3浮动(float)与清除(cleal)浮动.lxe │ ├4如何使用手册与表单张3...

Global site tag (gtag.js) - Google Analytics