数据库---事务的隔离级别

首先,我们下面说的数据库事务,都是使用INNODB引擎的结果。
MYISAM是没有事务的,也就没有下面这些说法。

1.数据库事务的四大特性:

  1. 原子性:事务包含的所有数据库操作要么全部成功,要不全部失败回滚
  2. 一致性:一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是100块,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是100块,这就是事务的一致性。
  3. 隔离性:一个事务未提交的业务结果是否对于其它事务可见。级别一般有:read_uncommit,read_commit,read_repeatable,Serializable。
  4. 持久性:一个事务一旦被提交了,那么对数据库中数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

了解上面的数据库事务四大特性后,我们就知道,数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable。

2.这四个隔离级别,分别可以解决下面这几类问题。

设置事务隔离级别为脏读不可重复读幻读
Read uncommitted会出现会出现会出现
Read committed不会出现会出现会出现
Repeatable read不会出现不会出现会出现
Serializable不会出现不会出现不会出现
  1. Serializable就是强制串行化,相当于让数据库只能单线程访问,所以上面这些问题都不会出现,但效率实在太低,所以一般不会考虑将数据库隔离级别设置成Serializable
  2. Read uncommitted又对事务放的太宽了,如果将数据库的隔离级别设置成Read uncommitted,那么各个事务之间就会各种乱搞乱读,那么基本上程序就会出现各种大bug,所以一般也不会将数据库隔离级别设置成Read uncommitted

3.常见的数据库默认的事务隔离级别:

  1. oracle的默认隔离级别Read committed,所以默认下可能会出现不可重复读和幻读的问题。
  2. mysql的默认隔离级别是Repeatable read,所以默认下可能出现幻读读问题。

4.解释下常见的这几类问题

  1. 脏读
    事务一对一条数据做了修改,但并未提交或者回滚的时候,事务二读到了这个事务一已经修改的数据,但是由于这条数据是否真的要修改,事务一还并没有确定,事务二就读到了,所以我们可以说,事务二读到了脏数据,这种问题就叫脏读。
    举个例子,数据库中有一条数据a=1,此时事务一做了修改:a=2,但并未提交
    如果此时事务的隔离级别是Read uncommitted的话,那么此时事务二再读a的值,就会读到2,那么如果此时事务一又回滚了,那么数据库真实的a的值还是1,但对于事务二来说,已经错了,因为事务二读到了2。
    如果此时事务的隔离级别是Read committed或Repeatable read或Serializable,那么事务二读到的a的值,就还是1。
  2. 不可重复读
    一个事务重复两次读取一条数据的中间,另一个事务对这条数据做了修改,导致第一个事务的两次读的结果出现不同。
    举个例子,小李买东西的时候,刷银行卡,一开始系统查到账户余额200元,于是准备开始执行扣款,于此同时,小李老婆刚好在另外一个地方将这200元取走了,从而导致小李这边扣款失败,这就是不可重复读的问题。
    注意:
    mysql的默认隔离级别下,是不会出现这种问题的;
    oracle的默认隔离级别下,会出现这种问题。
  3. 幻读
    一个事务以相同的条件查询以前检索过的数据,一般指查询数据条数的时候,由于其他事务对某些数据做了增或者删,导致第一个事务查出来的总条数和以前的结果不同了,这叫幻读。
    其实一般情况的业务下,幻读是可以接受的,所以我个人认为幻读不算什么问题吧。
    而且mysql和oracle的默认隔离级别下,也都会出现这个幻读的现象。
    如果非要解决幻读,无非就是加个表级别的锁,这样效率太差了,而且一般都没必要。

5.mysql 对隔离级别的查询和设置

查询隔离级别:
SHOW VARIABLES LIKE ‘tx_isolation’;

设置隔离级别:
SET GLOBAL tx_isolation=‘REPEATABLE-READ’;
SET SESSION tx_isolation=‘SERIALIZABLE’;

GLOBAL是全局,SESSION是当前会话,如果没有指定,默认是SESSION。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS崩溃日志收集

一、概述iOS-App崩溃分为两种,一种是异常:NSException,一种是信号:Signal。二、异常崩溃1.NSException对象(1)reason:崩溃原因。(2)callStackSymbols:调用堆栈。(3)name:崩溃名称(4)userInfo&am…

统计iOS项目代码行数

打开终端,输入如下命令:find . -name "*.m" -or -name "*.h" -or -name "*.xib" -or -name "*.c" | xargs wc -l 此命令会迭代子目录,会统计每个源代码文件行数及总数,统计的行数包含空…

一个简单的权限系统模型

我们知道,一般说的简单的权限系统,都是使用shiro或者spring-security shiro之前用的比较多,原理也容易理解,算是比较成熟的权限方面的框架spring-security相对源码比较难懂,但由于与spring的完美融合,也有…

获取iOS任意线程调用堆栈(一)获取任意线程的调用栈地址列表

转载自:http://blog.csdn.net/jasonblog/article/details/49909163 如果要获取当前线程的调用栈,可以直接使用现有API:[NSThread callStackSymbols]。 但是并没有相关API支持获取任意线程的调用栈,所以只能自己编码实现。 1. 基础…

linux---基础01

Linux是一种自由和开放源码的操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机 Linux的目录结构 bin (binaries)存放二进制可执行文件 boot 存放用…

获取iOS任意线程调用堆栈(二)符号化理论:Mach-o文件结构

我们知道Windows下的文件都是PE文件,同样在OS X和iOS中可执行文件是Mach-o格式的。 所以我们如果要进行逆向分析,首先要熟悉Mach-o文件结构。 Mach-o包含三个基本区域: 头部(header structure)。 加载命令(…

linux---基础02

二、用户、组管理命令 Linux采用组来组织和管理用户 在Linux中每个用户有唯一的用户标识符UID,该UID是一个无符号整数。 同时每个用户也必须至少属于一个组,也有组标识符GID。 其中UID与GID独立编号。 1. groupadd命令 (1)grou…

获取iOS任意线程调用堆栈(三)符号化理论:从Mach-o结构分析类名方法名

下面来讲讲如何从Mach-o文件中分析出类名和方法名,也让我们了解下class-dump的原理。 Mach-o结构有两个节:__objc_classname 和 __objc_methname 其中就是类名和方法名。 其中__objc_classname的偏移为:ox7961 __objc_methname的偏移为0x6…

linux---基础03

三、 文件属性操作命令 1. chown命令 (1)chown示例一:改变文件的属主 [rootserver1 ~]# chown user1 hello.txt功能:将指定文件hello.txt的属主(所有者)改为user1。(2)chown示例…

获取iOS任意线程调用堆栈(四)符号化实战

转载自:http://blog.csdn.net/jasonblog/article/details/49909209 1. 相关API和数据结构 由于我们在上面回溯线程调用栈拿到的是一组地址,所以这里进行符号化的输入输出应该分别是地址和符号,接口设计类似如下: - (NSString *)s…

linux---基础04

六、网卡配置 分配临时IP地址: ifconfig eth0 up // 启用eth0网卡ifconfig eth0 192.168.1.104 netmask 255.255.255.0静态分配IP地址: vi /etc/sysconfig/network-scripts/ifcfg-eth0service network restart //重启 network服务(重新加载网卡配置)动态…

记录---基于BigDecimal的特殊的四舍五入

机试问题—实现基于BigDecimal的特殊的四舍五入。 这是一道外企的机试题,我把里面的某个难点部分,摘出来详细如下: //实现特殊的四舍五入,先普通四舍五入取到小数点后两位,然后最后一位向后进位,0和5不变&…

获取iOS任意线程调用堆栈(五)完整实现:BSBacktraceLogger

转载自:https://toutiao.io/posts/aveig6/preview BSBacktraceLogger 是一个轻量级的框架,可以获取任意线程的调用栈,开源在我的 GitHub,建议下载下来结合本文阅读。 我们知道 NSThread 有一个类方法 callstackSymbols 可以获取调…

Mac电脑如何彻底删除清除数据?CleanMyMac X软件更专业

虽然不用杀毒,但是日常的清理还是有必要的,特别是卸载一些软件会有残留,可以用命令mdfind来找,然后删,这里给新手用户推荐一款应用clean my mac x,定期清理一下,不用的时候关掉就可以。 CleanM…

git总是提示输入用户名密码的解决记录

git总是提示输入用户名密码的解决记录 git改过密码后,再用命令行pull代码(举个例子),就会每次让你输入用户名密码,很麻烦,比如: git pull origin dev:dev 输入用户名密码,ok了 git…

Git的思想和基本工作原理

转载自:http://www.nowamagic.net/academy/detail/48160210# 在开始学习 Git 的时候,请不要尝试把各种概念和其他版本控制系统(诸如 Subversion 和 Perforce 等)相比拟,否则容易混淆每个操作的实际意义。Git 在保存和处…

java后端获取客户端(用户)真实ip,原理

java后端获取客户端真实ip,原理: 一般都是下面代码中的做法:但很多人只知道这样能拿到,稍微有改动就不知道怎么办了 看看网上的各种说法,接下来容我一一讲解,如有纰漏,敬请指正。 public sta…

kafka入门:简介、使用场景、设计原理、主要配置及集群搭建

本文转自:http://www.aboutyun.com/thread-9341-1-1.html一、入门1、简介Kafka is a distributed,partitioned,replicated commit logservice。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存…

git大小写解决

git大小写解决 git reset --hard head git的回退操作 git config --get core.ignorecase 查看git忽略大小写的状态,true就是忽略大小写,false就是不忽略大小写 git config core.ignorecase false 更改git为不忽略大小写 情景1:(…

深入理解Hadoop集群和网络

云计算和Hadoop中网络是讨论得相对比较少的领域。本文原文由Dell企业技术专家Brad Hedlund撰写,他曾在思科工作多年,专长是数据中心、云网络等。文章素材基于作者自己的研究、实验和Cloudera的培训资料。 本文将着重于讨论Hadoop集群的体系结构和方法&am…