2019独角兽企业重金招聘Python工程师标准>>>

事务介绍

因为一直使用Spring这种声明式的事务管理,一直以为事务的主要作用是对一个业务方法中多次执行数据库操作的最终提交。近期重新了解了下事务,有了新的认识。数据库事务除了有异常回滚的功能,更重要的是控制数据表的共享数据。

首先数据库事务需要满足四个特性ACID,原子性、一致性、隔离性、持久性。数据一致性是最终目标,其他特性都是为达到该目的的措施。

和Java程序采用对象锁机制进行线程同步类似,数据库管理系统采用数据库锁机制保证事务的隔离性。当多个事务试图对相同的数据进行操作时,只有持有锁的事务才能操作数据。

通常数据并发会造成3类数据读问题(脏读,不可重复读,幻想读)以及2类数据更新问题(第一类丢失更新和第二类丢失更新)

1、脏读(dirty read):A事务读取B事务尚未提交的更改数据,并在这个数据的基础上操作。如果恰巧B事务回滚,那么A事务读到的数据根本是不被承认的。

在这个场景中,B希望取款500元而后又撤销了动作,而A往相同的账户中转了100元,因为A读了B未提交的事务,并且最后修改了金额,造成账户白白丢失了500元。在oracle中使用数据版本机制,不会发生脏读的情况。

2、不可重复读(unrepeatable read):A事务读取了B事务已经提交的更改数据。即A事务读取多次数据,但是读取的过程中,B事务可能修改了金额,造成A事务每次读取的数据可能不一致。

3、幻象读(phantom read):A事务读取B事务提交的新增数据,这时A事务将出现幻想读的问题。假设银行系统在同一个事务中,两次统计存款账户的总金额,在两次统计的过程中,刚好新增了一个账户,并存款100元,这时两次统计的总金额不一致。

幻象读和不可重复读的区别是,幻象读是发生在新增数据的时候,不可重复读发生在修改数据的时候。两种情况采取的对策不一样,不可重复读只要对操作的数据添加行级锁,阻止操作中的数据发生变化,而幻象读,要防止新增数据,往往需要添加表级锁,将整个表锁定,防止新增数据(oracle使用多版本的数据方式实现)。

4、第一类丢失更新:A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错误很严重,如下

5、第二类丢失更新:A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失。

这种情况银行会有损失,感觉还是蛮好的。

数据库锁机制

数据库的锁按锁定的对象不同,可以分为表锁定和行锁定。按并发事务锁定的关系,可以分为共享锁定和独占锁定。共享锁定会防止独占锁定,但允许其他的共享锁定。独占锁定既防止其他的独占锁定,也防止其他的共享锁定。为了更改数据,数据库必须在进行更改的行上施加行独占锁定,insert、update、delete、select for update语句都会隐士采用必要的行锁定。

如下是oracle常用的5中锁定

1、行共享锁定:一般通过select for update 语句隐式获得。行共享锁定并不防止对数据行进行更改的操作,但是可以防止其他会话获取独占性数据表锁定。允许进行多个并发的行共享和行独占性锁定,还允许进行数据表的共享或者采用共享行独占锁定。

2、行独占锁定:通过一条insert、update、delete语句隐士获取,或者通过一条LOCK TABLE ROW EXCLUSIVE MODE语句显示获取。这个锁可以防止其他会话获取一个共享锁定,共享行独占锁定或独占锁定。

3、表共享锁定:通过LOCK TABLE IN SHARE MODE语句显示获得,这种锁定可以防止其他会话获取行独占锁定(insert,update,delete),或者防止其他表共享行独占锁定或表独占锁定,它允许在表中拥有多个行共享和表共享锁定,该锁定可以让会话具有对表事务级一致性访问,因为其他会话在用户提交或者回溯该事务并释放对该表的锁定之前不能更改这个被锁定的表。

4、表共享行独占锁定:通过 LOCK TABLE IN SHARE ROW EXCLUSIVE MODE语句显示获得。这种锁定可以防止其他会话获取一个表共享、行独占或者表独占锁定,它允许其他行共享锁定,它允许其他行共享锁定。这种锁定类似于表共享锁定,只是一次只能对一个表放置一个表共享行独占锁定。如果A会话拥有该锁定,则B会话可以执行select for update操作,但如果B会话试图更新选择的行,则需要等待。

5、表独占:通过LOCK TABLE IN EXCLUSIVE MODE显示获得。这个锁定防止其他会话对该表的任何锁定。

事务隔离级别

因为直接使用数据的锁比较麻烦,用户可以设置事务的隔离级别来实现自动锁机制。通过设置事务的隔离级别,数据库就会分析事务中的SQL语句,然后自动为事务操作的数据资源加上适合的锁。


转载于:https://my.oschina.net/everyDay111/blog/602052

数据库事务及锁机制介绍相关推荐

  1. Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁

    1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...

  2. 数据库事务与锁(一)——事务的简单介绍

    前言 最近系统上线了,这两天收到反馈,操作按钮动不了了.删除按钮动不了了等等类似的问题,仔细查看日志错误,提示:Lock wait timeout exceeded; try restarting t ...

  3. mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁

    注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库 ...

  4. Redis 事务与锁 机制

    本笔记基于bilibili尚硅谷Redis学习视频整理而来 Redis 事务与锁 机制 Redis的事务定义 Redis主要使用MULTI, EXEC, DISCARD 和 WATCH 命令来实现事务 ...

  5. 【转】事务和锁机制是什么关系? 开启事务就自动加锁了吗?

    数据库锁 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对同一张表进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了 ...

  6. 【直击DTCC】浪潮霍俊路详解数据库集群锁机制管理

    2016年5月12日-14日,第七届中国数据库技术大会(DTCC 2016)在北京国际会议中心拉开帷幕.今年的大会首次设立了"数据库内核技术"专场,着重突出"内核的实现技 ...

  7. 数据库中的锁机制(数据库中有哪些锁)

    数据库中的锁机制 锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性.各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别.目前,大多数数据库管理系统都 ...

  8. 数据库为什么需要锁机制?有哪些锁机制?

    [为什么要锁] 数据库是一个多用户使用的共享资源,比如一个用户表t_user,两个浏览器前面的人登录了同个一个账号,把电话号码改了.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数 ...

  9. Redis的事务和锁机制(乐观锁和悲观锁)

    Redis学习笔记(四) 1,Redis事务的定义 2,Redis事务操作的三个基本命令 3,解决Redis中的事务冲突(乐观锁和悲观锁) 3.1,悲观锁 3.2,乐观锁 3.3,Redis中使用乐观 ...

最新文章

  1. stm32f102 SPI口重复初始化引起的问题及解决办法
  2. php获取日期中的月份,年份
  3. diy nas配置推荐2019_在Windows Server 2019上配置NAS的方法
  4. 复习-css列表和表格相关属性
  5. mac恢复iphone_免费下载:旧Mac和iPhone壁纸的令人震惊的完整档案
  6. 每日一题(27)—— define定义一个宏表明1年中有多少秒
  7. Objective-C ,ios,iphone开发基础:ios数据库(The SQLite Database),使用终端进行简单的数据库操作...
  8. 机器学习笔记2 – sklearn之iris数据集
  9. oracle的日志模式,Oracle数据日志模式
  10. Gstreamer之gst-plugin-bad交叉编译集成x265(二十二)
  11. Postman中的Pre-request Scrip详解
  12. 《认知觉醒》 读书笔记
  13. 系统上电后 bootloader的执行流程
  14. 前端速成:双月Java之旅(week5)_day1
  15. 解决HTML5页面在手机浏览器测试中发现 横向滚动条,尽管页面没有内容也是照常出现。
  16. C语言Matrix编程题——[Recursion]D. Liang 8.1 Computing factorials
  17. hbase安装配置 整合到hadoop
  18. 从视图索引说Notes数据库
  19. 【Unity+MySQL】实现简单的注册登录系统
  20. 不用找了,50个备课网站一网打尽

热门文章

  1. main函数第3个参数envp装的是什么(envp:环境变量)
  2. 汇编语言随笔(8)-实验9(显示字符串)、实验10(子程序:除法溢出,数值到字符串的转换)和课程设计1
  3. 最小代价生成树Prim/Kruskal(c/c++)
  4. Ubuntu 取消 Apache及MySQL等自启动
  5. springboot使用rabbitMQ(带回调)
  6. Heroku创始人Adam Wiggins发布十二要素应用宣言
  7. [bzoj 1954]Pku3764 The xor-longest Path
  8. PAL算法原理及代码实现
  9. Https 客户端与服务器交互过程梳理(转)
  10. Asp.net mvc4用JQuery插件实现异步上传