数据库事务并发了解一下呗

看了两天Java源码,有点懵、今天翻了一波面试的交流贴,唉,看看各大公司出的那些生怕你通过的面试题、真是觉得自己前途一片昏暗,片昏暗,昏暗,暗。。。

but,习还是要学的,从面试题里看到有问数据库并发问题的,之前上课明明学过数据库原理的,但是看着题目大脑还是一片空白,片空白,空白,白。。。都是之间学习不总结的坑

so,来吧,再学一遍,同时梳理总结一下。好记性不如烂笔头头头头头!

数据库事务的四大特性(ACID)

原子性(Atomicity):是指一个事务中包含的所有操作,要么全做,要么全不做。

一致性(Consistency):指数据库从一个一致性状态转移到另一个一致性状态,只包含已提交的事务,如果某些事务尚未完成被迫中断,而该事务对数据库的修改已经写入物理数据库,此时数据库处于一个不正确的状态。比如A向B转账,不可能A扣了钱,B却没收到。

隔离性(Isolation):是指各个并发事务之间互不干扰。

持久性(Durability):是指事务一旦提交,对数据库的修改是持久的,即使 数据库发生故障也能进行恢复。

数据库事务并发引起的问题

脏读:也叫读脏数据,是指当前事务读取了其他事务还未提交的修改。发生脏读是由于一个事务在提交之前对数据库的修改对其他事务是可见的。举个小栗子:例如A和B在同时卖票,目前系统仅剩一张票,此时尼古拉斯去A处买了一张票,A将数据库中的余票量-1,此时有人去B处买了一张票,B查询数据库发现现在木有票了,于是告诉买者没票了。但是!B处买者走了以后,尼古拉斯突然不想买了,于是A取消之前的操作,并提交事务,此时就导致两处都没有卖出票。这就是因为B读取了A没有提交的数据。

不可重复读:是指一个事务两次读取的结果不一样,这是由于在两次读取的间隔另一个事务修改了数据库并提交。不可重复读和读脏数据的区别是脏读发生在事务提交前,不可重复读是发生在事务提交后。

幻读:事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。不可重复读和幻读的区别在于前者是针对某一条记录,后者是针对一批记录。

以上是一些读问题,还有一些更新问题

更新丢失问题

第一类更新丢失问题:A和B对数据库进行更新,A失败回滚到原点把B对数据库的更新给覆盖掉了。

第二类更新丢失问题:A和B对数据库进行更新,A对数据库的更新覆盖了B对数据库的更新。

对于事务并发引起的问题及一些例子可以参考https://blog.csdn.net/starlh35/article/details/76445267

事务的四种隔离级别

为了保证事务的隔离性,数据库提供了四种隔离级别

读未提交:一个事务在进行写操作时,不允许其他事务进行写操作,但允许其他数据的读操作。这个级别的隔离可以避免更新丢失,但是会导致读脏数据

读已提交:未提交的写事务将会禁止其他事务访问该行。一个这个级别的隔离可以解决读脏数据的问题,但仍然存在不可重复读的问题

可重复读:读取数据的事务禁止其他事务的写操作(避免不可重复读),但允许读事务,写事务则禁止其他一切事务(避免脏读)。该级别仍存在幻读的问题

串行化 :要求事务序列化也就是只能一个接一个执行,该级别的隔离可以避免脏读,不可重复读以及幻读的问题,但是性能不佳,一般很少使用

测试数据库的隔离级别参考https://www.jianshu.com/p/8d735db9c2c0  和  https://www.jb51.net/article/116477.htm一定要看,便于理解。

在mysql中查看当前事务的隔离级别:

select @@tx_isolation;

在MySQL数据库中设置事务的隔离 级别:

set  [glogal | session]  transaction isolation level 隔离级别名称;或者set tx_isolation=’隔离级别名称;’

好了,先酱吧、

原文地址:https://www.cnblogs.com/April1995/p/9555542.html

时间: 2024-10-12 19:08:24

数据库事务并发了解一下呗的相关文章

网上资料笔记总结!!数据库事务并发问题,锁机制和对应的4种隔离级别

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

简述数据库事务并发机制

摘要: 事务是最小的逻辑执行单元,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态.事务具有四个重要特性,即原子性(Atomicity).一致性(Consistency).隔离性 (Isolation)和持久性 (Durability).本文首先叙述了数据库中事务的本质及其四大特性(ACID)的内涵,然后重点介绍了事务隔离性的动机和内涵,并介绍了数据库为此所提供的事务隔离级别以及这些事务隔离级别能解决的事务并发问题.介于并发安全与并发效率的平衡,我们一般

PHP使用数据库的并发问题

原载于我的博客 http://starlight36.com/post/php-db-concurrency 在并行系统中并发问题永远不可忽视.尽管PHP语言原生没有提供多线程机制,那并不意味着所有的操作都是线程安全的.尤其是在操作诸如订单.支付等业务系统中,更需要注意操作数据库的并发问题. 接下来我通过一个案例分析一下PHP操作数据库时并发问题的处理问题. 首先,我们有这样一张数据表: mysql> select * from counter; +----+-----+ | id | num

数据库事务中的隔离级别和锁+spring Transactional注解

数据库事务中的隔离级别和锁 数据库事务在后端开发中占非常重要的地位,如何确保数据读取的正确性.安全性也是我们需要研究的问题. ACID 首先总结一下数据库事务正确执行的四个要素(ACID): 原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做,不能只做一部分:一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整性约束没有被破坏:比如我们做银行转账的相关业务,A转账给B,要求

Oracle 数据库中不同事务并发访问的问题

现象 以SQL/Helper为例,打开不同的SQL窗口,对同一个表格进行操作,如下所示. 窗口1:当执行更新任务.紧接着执行查询时获得一组查询结果.结果是对的. 窗口2:而在另外一个SQL查询窗口中执查询,却得到更新前的结果. 当关闭窗口1时,执行窗口2,发现出现正确的更新结果. 分析 初步分析是数据库的并发访问的问题.当在窗口1中执行更新操作,对数据表格的引用并未有消除,而是在数据库中产生了针对当前事务的副本结果.而窗口2所针对的查询还是旧的更新前的数据库原本.当关闭窗口1后,数据库中的表格被

数据库之事务并发问题与事务的隔离级别

事物的并发问题: 事物的并发问题主要分四个方面,即丢失更新,脏读,不可重复读,幻读.如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时,则可能会发生以上几种问题. 1.丢失更新 当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题.每个事务都不知道其它事务的存在.最后的更新将重写由其它事务所作的更新,这样就会导致数据丢失.丢失更新可分为两类: 第一类丢失更新 例如: 时 间   取款事务                             

数据库事务的四大特性和事务隔离级别

Reference: [1] http://www.cnblogs.com/fjdingsd/p/5273008.html [2] http://blog.csdn.net/fg2006/article/details/6937413 数据库事务四大特性 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全

数据库事务隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Serializable,这四个级别可以逐个解决脏读.不可重复读.幻读这几类问题. √: 可能出现    ×: 不会出现   脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意:我们讨论隔离级别的场景,主要是在多个

数据库-事务和锁

事务 所谓事务是用户定义的一个数据库操作系列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位.例如在关系数据库中,一个事务可以是一条sql语句.一组sql语句或整个程序. 给个栗子: 小IT在网上购物,其付款过程至少包括以下几步数据库操作: 更新客户所购商品的库存信息: 生成订单并且保存到数据库: 更新用户相关信息,例如购物数量等: 正常情况下,操作顺利进行,最终交易成功,那么与交易相关的所有数据库信息也成功更新.但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存