数据库的事务级别介绍与操作

 关系型数据库都具有一套事务级别,以前的开发和学习过程我很少关注过这个概念,今天搜集了一些资料,在

结合spring声明式事务学习的同时,总结一下数据库的事务级别与操作。

READ-UNCOMMITTED: 未提交读 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )

READ-COMMITTED: 提交读 会出现不可重复读、幻读问题(锁定正在读取的行)

REPEATABLE-READ: 可重复读 会出幻读(锁定所读取的所有行)

SERIALIZABLE: 序列化 保证所有的情况不会发生(锁表)

详细说明:

未提交读——这通常称为 'dirty read':non-locking SELECT 的执行使我们不会看到一个记录的可能更早的版本;
因而在这个隔离级别下是非 'consistent' reads;这级隔离级别的运作如同 READ COMMITTED。处于这个隔离级的
事务可以读到其他事务还没有提交的数据。如果这个事务使用其他事务未提交的变化作为计算的基础,然后那些未
提交的变化被他们的父事务撤销,则会导致误差。

提交读——在一个事务中已经COMMIT的数据可以在其他事务中看到。如果这个事务频繁提交的话,其他的大的查询
事务中可能会得到多个不同的结果。

可重复读——这是 InnoDB 默认的事务隔离级。在一个事务中所有读都是连续的。

序列化——提供最大程度的隔离,如果每个事务都以这种隔离级运行就会影响Mysql的性能,因为需要大量的资源来
使大量事务在任一时刻不被看到。如果一个事务在执行一个SELECT操作,另外的事务不允许执行UPDATE操作,这个
隔离级别下的SELECT操作被阴式地转换为 SELECT ... LOCK IN SHARE MODE。

不可重复读的重点是修改 : 
同样的条件 ,   你读取过的数据 ,   再次读取出来发现值不一样了 
幻读的重点在于新增或者删除 
同样的条件 ,   第 1 次和第 2 次读出来的记录数不一样


MySQL InnoDB存储引擎的事务隔离级别

查看InnoDB系统级别的事务隔离级别:

以下为引用的内容: 
mysql> SELECT @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ   |
+-----------------------+
1 row in set (0.00 sec)
 


查看InnoDB会话级别的事务隔离级别:

以下为引用的内容: 
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
 


修改事务隔离级别:

以下为引用的内容: 
mysql> set global transaction isolation level read committed;

  Query OK, 0 rows affected (0.00 sec)

  mysql> set session transaction isolation level read committed;

  Query OK, 0 rows affected (0.00 sec)
 


InnoDB的可重复读隔离级别和其他数据库的可重复读是有区别的,不会造成幻象读(phantom read),所谓幻象读,

就是同一个事务内,多次select,可以读取到其他session insert并已经commit的数据。下面是一个小的测试,证明

InnoDB的可重复读隔离级别不会造成幻象读。测试涉及两个session,分别为session 1和session 2,隔离级别都是

repeateable read,关闭autocommit


以下为引用的内容:

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

  mysql> set autocommit=off;

  Query OK, 0 rows affected (0.00 sec)

  session 1 创建表并插入测试数据

  mysql> create table test(i int) engine=innodb;

  Query OK, 0 rows affected (0.00 sec)

  mysql> insert into test values(1);

  Query OK, 1 row affected (0.00 sec)

  session 2 查询,没有数据,正常,session1没有提交,不允许脏读

  mysql> select * from test;

  Empty set (0.00 sec)

  session 1 提交事务

  mysql> commit;

  Query OK, 0 rows affected (0.00 sec)

  session 2 查询,还是没有数据,没有产生幻象读

  mysql> select * from test;

  Empty set (0.00 sec)

以上试验版本:

mysql> select version();
+-------------------------+c
| version()       |
+-------------------------+
| 5.0.37-community-nt-log |
+-------------------------+
1 row in set (0.00 sec)

 

spring的声明式事务的隔离级别与数据库的如出一辙,共5种级别:

1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
      另外四个与JDBC的隔离级别相对应
 2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
      这种隔离级别会产生脏读,不可重复读和幻像读。
 3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
 4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
      它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
 5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
      除了防止脏读,不可重复读外,还避免了幻像读。  


本文转自施杨博客园博客,原文链接:http://www.cnblogs.com/shiyangxt/archive/2009/02/11/1388519.html,如需转载请自行联系原作者   

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

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

相关文章

中国做图像处理的公司

(1) 北京北方猎波科技有限公司:http://www.northwh.com/beifangliebo/main1.html 红外探测成像产品 (2) 深圳超多维光电子有限公司北京分公司:http://www.superd.com.cn 立体显示设备 (3&…

[ilink32 Error] Error: Unresolved external 'SendARP'

[ilink32 Error] Error: Unresolved external SendARP referenced from E:\APPOBJ\KSRGETMAC.OBJ #pragma link "iphlpapi.lib" 转载于:https://www.cnblogs.com/cb168/p/5573478.html

3.cocos2dx它Menu,由menu为了实现场景切换

1 头文件 TMenu.h #ifndef __TMENU_H__ #define __TMENU_H__ #include "cocos2d.h" USING_NS_CC; class TMenu :public CCLayer { public: static CCScene * scene(); CREATE_FUNC(TMenu); bool init(); CCMenu * menu; void menuCallback(C…

Difference: throw or throw ex?

Difference: throw or throw ex? 主要区别在于throw出的堆栈详细程度。 throw ex只是抛出在当前代码处的错误。 throw 能够更进一步,抛出内部调用的具体错误。 Just for demonstrating, if you have classes in C# as follows: using System;namespace WindowsAppl…

学习笔记01:1.1 基于概率的信任

基于概率的信任 大数定律:当样本数量越来越多时,预测事件也就越来越接近于真实的事件,事件出现的频率无穷地接近事件发生的概率建模检验:人工规则->学习模型,数据少则重视先验,数据多则重视后验给予概率…

人工智能数学基础知识

方差的概念与计算公式,例1 两人的5次测验成绩如下:X: 50,100,100,60,50 E(X)72;Y: 73, 70, 75,72,70 E(Y)72。平均成绩相同…

学习笔记02:直播串讲——3/22

去 就 就 就 接近 就 就 接近

认真分析mmap:是什么 为什么 怎么用

mmap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存&#xff…

数据库子查询

子查询,又叫做嵌套查询。 将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询。 子查询有两种类型: 一种是只返回一个单值的子查询,这时它可以用在一个单值可以…

摄像头资料

https://blog.csdn.net/u013749068/article/details/79463736

配置vim在源代码中自动添加作者信息

每个程序员都有自己心爱的代码编辑和查看工具,相信不少Linux下的程序员都喜欢用Vim,尽管Vim没有SourceInsight这种依托于桌面环境的编辑器看起来那样强大,但是Vim的高效、简洁以及强大的可配置性都让它吸引了无数忠实的fans。 很多编辑器都支…

paddle模块的详细介绍

https://blog.csdn.net/hua111hua/article/details/89415396

[CareerCup] 2.4 Partition List 划分链表

2.4 Write code to partition a linked list around a value x, such that all nodes less than x come before all nodes greater than or equal to x. LeetCode上的原题,请参见我之前的博客Partition List 划分链表。转载于:https://www.cnblogs.com/grandyang/p/…

sdl的缩放问题

SDL是一种既是开源的,也是跨平台的多媒体开发包,在各种平台上应用很广,经常和FFMPEG等解码器同时使用。对于在windows mobile等缺乏通用播放器的平台来说,是一种很好的选择。网上很多代码,介绍SDL的用法,主…

Ubuntu系统盘制作

1、首先打开UltraISO软件,尽量下载最新版的,小编曾用某个旧版的UltraISO,制作的安装盘,不能不能识别磁盘,安装失败! 2、点击工具栏中的第二个打开镜像文件工具,如图红色方框标志按钮,然后在打开…

RH131 网络配置

ip addr show 查看当前网络地址 ip link show 查看网络链接状态 ip -s link show 查看网卡统计信息 ip addr add 192.168.0.154 添加ip地址 ip link dev eth0 down 禁用ip地址 网卡的配置文件/etc/sysconfig/network-scripts/ifcfg-ethx 自动专用地址:169.254.*.* …

学习笔记02:直播串讲02

1.基于模型的学习 根据以往的学习经验,建立起输入输出的模型,然后预测输入,并且将输入带入到模型中,进而预测出输出的结果,这种学习称为基于模型的学习 2.机器学习的过程 1)数据收集:通过爬虫、…

如何将Pcm格式的音频文件转换成Wave格式的文件

最近在做一款变声App,其中就用到了将pcm格式转wave格式,下面贴出源代码,希望带有需求的童鞋有帮助!!!这里是c语言写的,也可以用java实现。当然java调用native函数要用到jni技术。具体jni技术自己…

Dojo仪表板

Dojo它提供了一个良好的仪表板显示器&#xff0c;的影响&#xff0c;如以下&#xff1a; <!DOCTYPE html> <html> <head><title>Dojo仪表盘</title><meta charset"utf-8"><script src"http://192.168.240.186/arcgis_js…