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

嗯,这里是简介,主题配置内可以修改,如留空则不显示

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

期初是因为在qq群里讨论mysql的幻读,然后讨论大事务的提交原理,期初我是知道  幻读   的,因为在之前的课本上有学到过,但是一直知道原理,而不知道在一个数据库中是什么样子的,既然在群里有人提出来,顺便就学习了下。


在网上查找到的一篇文章,并经过自己的理解。

下面的链接是找到的文章:http://blog.sina.com.cn/s/blog_4c197d420101awhc.html



1、首先理解一下事务的概念

事务是DBMS得执行单位。它由有限得数据库操作序列组成得。但不是任意得数据库操作序列都能成为事务。一般来说,事务是必须满足4个条件(ACID)

      原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,就是说不允许事务部分得执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库得影响!
      一致性(Consistency):事务操作之后,数据库所处的状态和业务规则是一致的;比如a,b账户相互转账之后,总金额不变!
      隔离性(Isolation):如果多个事务并发执行,应像各个事务独立执行一样!
      持久性(Durability):事务提交后被持久化到数据库.
 
 
2、在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类型的数据表才能支持事务处理!其他的类型是不支持!(不是很清楚,至少BDB数据库引擎我没见过)
 
 
 
 
3、关于脏读,不可重复读,幻读
 
※脏读:一个事务读取了另一个未提交的并行事务写的数据。
      (事务T1更新了一行记录的内容,但是并没有提交所做的修改。事务T2读取更新后的行,然后T1执行回滚操作,取消了刚才所做的修改。现在T2所读取的行就无效了。)
 
※不可重复读:一个事务重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务修改过。
      (事务T1读取一行记录,紧接着事务T2修改了T1刚才读取的那一行记录。然后T1又再次读取这行记录,发现与刚才读取的结果不同。这就称为“不可重复”读,因为T1原来读取的那行记录已经发生了变化。)
 
※幻读:一个事务重新执行一个查询,返回一套符合查询条件的行,发现这些行因为其他最近提交的事务而发生了改变。
      (事务T1读取一条指定的WHERE子句所返回的结果集。然后事务T2新插入 一行记录,这行记录恰好可以满足T1所使用的查询条件中的WHERE 子句的条件。然后T1又使用相同的查询再次对表进行检索,但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”,因为对T1来说这一行就像突 然出现的一样。)
 
根据mysql的默认  事务隔离  机制,
 
1、mysql不会发生 脏读,
2、mysql会发生   不可重复读
3、不会发生   幻读。
 
 
 
4、事务隔离级别描述:
 
      READ UNCOMMITTED:幻读,不可重复读和脏读均允许;
      READ COMMITTED:允许幻读和不可重复读,但不允许脏读;
      REPEATABLE READ:允许幻读,但不允许不可重复读和脏读;
      SERIALIZABLE:幻读,不可重复读和脏读都不允许;
 
从上到下:隔离级别越高,性能损失越大,安全性越高。
 
      ORACLE默认的是 READ COMMITTED。
      MYSQL默认的是 REPEATABLE READ。
 
还是感觉Oracle更加合理一点。当然SERIALIZABLE是最为安全的。
 
 
 
 
5、修改事务的隔离级别:
      在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;
 
 
 
 
 
 


发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Hello world. 豫ICP备16008819号-1.

Power by Z-BlogPHP  Theme by wzdaxue