

事务隔离级别
一: 事务的特性ACID: 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability).
二: 事务需要注意几点:
1、首先,事务就是要保证一组数据库操作,要么全部成功,要么全部失败;
2、在 MySQL 中,事务支持是在引擎层实现的;
3、并不是所有引擎都支持事务,如 MyISAM 就不支持,InnoDB 就支持;
三: 隔离的重要性
1: 脏读:
一个事务在处理过程中读取了另一个事务未提交的数据
2: 不可重复读:
一个事务范围内, 多次查询某个数据, 却得到不同的结果
假设你真给小编打赏了一分钱,小编乐得屁颠屁颠地去准备提现,一查,发现真多了一分钱。
在这同时,在我还没有提现成功之前,小编的老婆已经提前将这一分钱支走了,小编此时再次查账,发现一分钱也没了。
脏读是某一事务读取了另外一个事务未提交的数据,不可重复读是读取了其他事务提交的数据。
其实,有些情况下,不可重复读不是问题,比如,小编提现期间,一分钱被老婆支走了,这不是问题!
而脏读,是可以通过设置隔离级别避免的.
3:幻读:
是事务非独立执行时发生的一种现象.
而操作事务 T1 的用户如果再查看刚刚修改的数据,会发现数据怎么还是 1?其实这行是从事务 T2 中添加的,就好像产生幻觉一样,这就是发生了幻读.
例如,小编准备提取你打赏的一分钱,提取完了,这时又有其他热心网友打赏了一分钱,小编一看,明明已经取出了,怎么又有一分钱!?
小编此时以为像做梦一样,我觉得也可以叫「梦读」
四:事务的隔离级别
NSI/ISO SQL 定义了 4 种标准隔离级别:
① Serializable(串行化):花费最高代价但最可靠的事务隔离级别。
“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
事务 100% 隔离,可避免脏读、不可重复读、幻读的发生。
② Repeatable read(可重复读,默认级别):多次读取同一范围的数据会返回第一次查询的快照,即使其他事务对该数据做了更新修改。事务在执行期间看到的数据前后必须是一致的。
但如果这个事务在读取某个范围内的记录时,其他事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行,这就是幻读。
可避免脏读、不可重复读的发生。但是可能会出现幻读。
③ Read committed (读已提交):保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。
可避免脏读的发生,但是可能会造成不可重复读。
大多数数据库的默认级别就是 Read committed,比如 Sql Server , Oracle。
④ Read uncommitted (读未提交):最低的事务隔离级别,一个事务还没提交时,它做的变更就能被别的事务看到。
任何情况都无法保证。
A,B 两个事务,分别做了一些操作,操作过程中,在不同隔离级别下查看变量的值:
隔离级别是串行化,则在事务 B 执行「将 1 改成 2」的时候,会被锁住。直到事务 A 提交后,事务 B 才可以继续执行。
再次总结
读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到。
读已提交:别人改数据的事务已经提交,我在我的事务中才能读到。
可重复读:别人改数据的事务已经提交,我在我的事务中也不去读。
串行:我的事务尚未提交,别人就别想改数据。
这 4 种隔离级别,并行性能依次降低,安全性依次提高。
参考链接: http://blog.itpub.net/31559358/viewspace-2221931/