事务是DBMS得执行单位。它由有限得数据库操作序列组成得。但不是任意得数据库操作序列都能成为事务。一般来说,事务是必须满足4个条件(ACID)
      原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,就是说不允许事务部分得执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库得影响!
      一致性(Consistency):事务操作之后,数据库所处的状态和业务规则是一致的;比如a,b账户相互转账之后,总金额不变!
      隔离性(Isolation):如果多个事务并发执行,应像各个事务独立执行一样!
      持久性(Durability):事务提交后被持久化到数据库.
MYSQL的事务处理主要有两种方法。
   1、用BEGIN,ROLLBACK,COMMIT来实现
      开始:START TRANSACTION或BEGIN语句可以开始一项新的事务
      提交:COMMIT可以提交当前事务,是变更成为永久变更
      回滚:ROLLBACK可以回滚当前事务,取消其变更
   2、直接用set来改变mysql的自动提交模式
       MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!
  我们可以通过set autocommit=0 禁止自动提交
              set autocommit=1 开启自动提交
       来实现事务的处理。
       但注意当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束,并且只用于当前连接。
    ※ MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持!
 
自己的理解(关于脏读,不可重复读,幻读)
      ※脏读:一个事务读取了另一个未提交的并行事务写的数据。
      (事务T1更新了一行记录的内容,但是并没有提交所做的修改。事务T2读取更新后的行,然后T1执行回滚操作,取消了刚才所做的修改。现在T2所读取的行就无效了。)
      
      exp:
      小明的分数为89,事务A中把他的分数改为98,但事务A尚未提交。
      与此同时,
      事务B正在读取小明的分数,读取到小明的分数为98。
      随后,
      事务A发生异常,而回滚了事务。小明的分数又回滚为89。
      最后,
      事务B读取到的小明的分数为98的数据即为脏数据,事务B做了一次脏读。
      (大部分数据库缺省的事物隔离级别都不会出现这种状况)
      
      ※不可重复读:一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。
      (事务T1读取一行记录,紧接着事务T2修改了T1刚才读取的那一行记录。然后T1又再次读取这行记录,发现与刚才读取的结果不同。这就称为“不可重复”读,因为T1原来读取的那行记录已经发生了变化。)
      exp:
      在事务A中,读取到小明的分数为89,操作没有完成,事务还没提交。
      与此同时,
      事务B把小明的分数改为98,并提交了事务。
      随后,
      在事务A中,再次读取小明的分数,此时工资变为98。在一个事务中前后两次读取的结果并不致,导致了不可重复读。
 
      ※幻读:一个事务重新执行一个查询,返回一套符合查询条件的行,发现这些行因为其他最近提交的事务而发生了改变。
      (事务T1读取一条指定的WHERE子句所返回的结果集。然后事务T2新插入 一行记录,这行记录恰好可以满足T1所使用的查询条件中的WHERE 子句的条件。然后T1又使用相同的查询再次对表进行检索,但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”,因为对T1来说这一行就像突 然出现的一样。)
      exp:
      目前分数为90分以上的的学生有15人,事务A读取所有分数为90分以上的的学生人数有15人。
      此时,事务B插入一条分数为99的学生记录。
      这是,事务A再次读取90分以上的的学生,记录为16人。此时产生了幻读。
      (大部分数据库缺省的事物隔离级别都会出现这种状况,此种事物隔离级别将带来表级锁)
 
事务隔离级别描述:
      READ UNCOMMITTED:幻读,不可重复读和脏读均允许;
      READ COMMITTED:允许幻读和不可重复读,但不允许脏读;
      REPEATABLE READ:允许幻读,但不允许不可重复读和脏读;
      SERIALIZABLE:幻读,不可重复读和脏读都不允许; 
      ORACLE默认的是 READ COMMITTED。
      MYSQL默认的是 REPEATABLE READ。
      
      如果数据库的隔离级别为REAE_UNCOMMITTED, 则其他线程可以看到未提交的数据, 因此就出现脏读;
      如果数据库隔离级别设为READ_COMMITTED,即没提交的数据别人是看不见的,就避免了脏读;但是,正在读取的数据只获得了读取锁,读完之后就解锁,不管当前事务有没有结束,这样就容许其他事务修改本事务正在读取的数据。导致不可重复读。
      REPEATABLE READ因为对正在操作的数据加锁,并且只有等到事务结束才放开锁, 则可以避免不可重复读;
      REPEATABLE READ只能保证正在被本事务操作的数据不被其他事务修改,却无法保证有其他事务提交新的数据。 则有可能线程1在操作表T1的时候(特别是统计性的事务),其他线程仍然可以提交新数据到表T1,这样会导致线程1两次统计的结果不一致,就像发生幻觉一样。
      SERIALIZABLE因为获得范围锁,且事务是一个接着一个串行执行,则保证了不会发生幻读。
      由此可见,隔离级别越高,受其他事物干扰越少,并发性能越差。
 
      二个或以上事务在操作同一个共享记录集时,可能会出现的问题:
      (A)脏读 (B)不可重复读 (C)幻读
      隔离级别:
      (1)read-uncommit, (2)read-commit, (3)read-repeatable, (4)read-serializable
      都是用来阻止上面的问题的,其中:
      (1)什么都阻止不了。
      (2)阻止(A)
      (3)阻止(A)(B)
      (4)阻止(A)(B)(C)
      (1)->(4)隔离级别越高,性能损失越大。
 
修改事务的隔离级别:
      在MySQL中默认事务隔离级别是可重复读(Repeatable read).可通过SQL语句查询:
      查看InnoDB系统级别的事务隔离级别:
      mysql> SELECT @@global.tx_isolation;
 
      结果:
      +-----------------------+
      | @@global.tx_isolation |
      +-----------------------+
      | REPEATABLE-READ       |
      +-----------------------+
 
      查看InnoDB会话级别的事务隔离级别:
      mysql> SELECT @@tx_isolation;
 
      结果:
      +-----------------+
      | @@tx_isolation  |
      +-----------------+
      | REPEATABLE-READ |
      +-----------------+
 
      修改事务隔离级别:
      mysql> set global transaction isolation level read committed;
      mysql> set session transaction isolation level read committed;
--------------------------------------------------------------------------------
 
@var是用户自定义变量(user defined vars),@@var是系统变量(system vars),@@var又分成两种:一个是seesion的(local),一个是server的(global)
 

设置会话变量有如下三种方式:( 全局同理 session-->global )

set session var_name = value;

set @@session.var_name = value;

set var_name = value;

查看一个会话变量也有如下三种方式:

select @@var_name;

select @@session.var_name;

show session variables like "%var%";

--------------------------------------------------------------------------------

 
set  [ global | session ]  transaction isolation level  [ replatable read | read commited | read uncommitted | serializable ]
 
我们知道指定GLOBAL关键字是可以修改全局的设置,用这个方式修改完后,已经存在的连接还不会生效,只有对新建立的连接才会起作用。
而指定SESSION关键字则是只修改当前连接会话的设置,修改完后立即生效,再次连接后会恢复成全局的设置,对其他连接/会话也不起作用。
另外,如果都不指定GLOBAL、SESSION关键字,会发生什么情况呢?
结果是:采用这种方式设置后,本次连接当前事务还未起作用,要到下一个(尚未启动的)新事务才起作用,下一个事务结束后,又将恢复成本次SESSION中原先的设置。
 
如果需要全局调整事务隔离级别,最好是在my.cnf全局配置文件中直接设置好。而如果是要在当前会话中临时调整,可以不要加上SESSION关键字,这样的话,当前事务结束下一个新事务开始后,会自行恢复SESSION的设置,无需人为调整,更加方便。
 
 
 

MySQL的事务处理及隔离级别的更多相关文章

  1. 关于MySQL的事务处理及隔离级别

    原文地址 :http://blog.sina.com.cn/s/blog_4c197d420101awhc.html 事务是DBMS得执行单位.它由有限得数据库操作序列组成得.但不是任意得数据库操作序 ...

  2. MySQL事务,事务隔离级别详解

    1.什么是事务 指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 2.事务的4个特性 原子性(Atomicity).一致性(Consistency).隔离性(Isolatio ...

  3. 面试必问的MySQL锁与事务隔离级别

    之前多篇文章从mysql的底层结构分析.sql语句的分析器以及sql从优化底层分析, 还有工作中常用的sql优化小知识点.面试各大互联网公司必问的mysql锁和事务隔离级别,这篇文章给你打神助攻,一飞 ...

  4. mysql事务_事务隔离级别详解

    使用事务语法 1. 开启事务start transaction,可以简写为 begin 2. 然后记录之后需要执行的一组sql 3. 提交commit 4. 如果所有的sql都执行成功,则提交,将sq ...

  5. Mysql 事务特性和隔离级别

    事务的特性 原子性(Atomicity) 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节.事务在执行过程中发生错误,会被回滚(Rollback)到 ...

  6. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

  7. 浅谈mysql中不同事务隔离级别下数据的显示效果

    事务的概念 事 务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查 询语句因为崩溃或其他原因而无法执行,那 ...

  8. 事务,Oracle,MySQL及Spring事务隔离级别

    一.什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种): 原子性 (atomicity):强调事务的不可分割:一致性 (consiste ...

  9. 一文搞定MySQL的事务和隔离级别

    一.事务简介 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供 ...

随机推荐

  1. azkaban:java任务调度系统

    github:https://github.com/azkaban/azkaban 官方网站:https://azkaban.github.io/ 好的介绍文章:http://srcct.com/20 ...

  2. 字符设备之register_chrdev与register_chrdev_region(转)

    之前写字符设备驱动,都是使用register_chrdev向内核注册驱动程序中构建的file_operations结构体,之后创建的设备文件,只要是主设备号相同(次设备号不同),则绑定的都是同一个fi ...

  3. 二、Jmeter录制脚本过程及Could not create script recorder报错、您的连接不是私密连接报错

    两个报错:Could not create script recorder报错和您的连接不是私密连接报错 1.录制过程 * 打开jmeter * 点击Templated,选择Recoding模版 * ...

  4. CentOS6.5 搭建在线yum源

    CentOS6.5 搭建在线yum源 发布时间:  2017-04-21 浏览次数:  611 下载次数:  1  问题描述 尽管有很多的免费镜像提供yum源服务,但是还是有必要建立自己的yum服务器 ...

  5. bzoj1830 Y形项链

    Description 小可可得到了一个可爱的Y型项链.小可可现在的项链是这个样子的:项链的最中间有一颗大珍珠作为结合点,从大珍珠上连出来3条由各种宝石串起来的链子.小可可希望让这3个链子完全一样,她 ...

  6. ThinkJava-多态

    8.2.1 方法调用绑定 解决的办法就是后期绑定,它的含义就是在运行时根据对象的类型进行绑定.后期绑定也 叫做动态绑定或运行时绑定.如果一种语言想实现后期绑定,就必须具有某种机制,以便在运 行时能判断 ...

  7. [UE4]GameMode

    GameMode定义了正在玩的游戏规则,积分等方面,游戏中有些数据和逻辑不适合放在某一个对象身上,这些数据在整个游戏运行中腰持续存在的(比如:积分.排名). 每次游戏一启动,GameMode就被创建, ...

  8. Eclipse里面的Maven项目如果下载依赖的jar包的源码

    Window---------Properties---------------Maven--------------勾选Download Artifact Sources和Download Arti ...

  9. oracle 所有 hint(转)

    oracle 10g 有64个hints , 11g 增加到71 个, 下表中红色的代表已经过时的, 粗体的是11g 新增. Optimization Goals and Approaches (2) ...

  10. python输入输出及变量

    知识内容: 1.python输出及注释 2.变量及常量 3.python用户输入 4.Hello,World程序 一.python输出及注释 1.python输出 在python2和python3中的 ...