赞
踩
其实,事务的本质就是若干个数据库操作的集合.并且这些集合都满足AICD的特性.
一个事务数据库中的最小执行单位,不能再拆分啦.
事务中的操作要么全部执行成功,要么全部执行失败.
事务之间不相互影响.
比如:脏读,未提交读,幻读,不可重复度,都是事务不同的隔离级别所导致的问题.使得事务之间相互影响.
在保证数据操作满足原子性的同时,也要保证其他事务的执行不会影响到本次事务的执行.
身高不能为负数,年龄不能小于0等;甲乙两人转账,他们的金额之和一定是相等的.
数据库中的数据要符合现实世界中的客观规律.
事务的结果要存在硬盘当中,存储在内存当中如果断电数据就丢失了.
本次事务的操作结果[提交之后],都应该被保存到磁盘当中,无论发生什么系统事故也不会影响本次事务的修改结果.
对这些一致性问题所带来的问题的危害进行排序:
脏读>不可重复读>幻读
性能:高---------------->低
如果一个事务读取到了另一个未提交事务修改过后的数据时,就意味着发生了脏读现象。
一个事务还没提交呢,该事务所做的变更就能被其他事务看到。
如果一个事务修改了另一个未提交事务读取的数据,就意味着发生了不可重复度现象。
在当前事务当中,相同的一句select语句所查询到的结果不一致。
如果一个事务先根据某些条件搜索查询出一些记录,在该事务未提交时,另一个事务写入了一些符合那些搜索条件的记录时,就意味着发生了幻读。[这里的写入可以使insert,delete,update操作]
注意幻读和不可重复度的区别,并不是说两次读取结果集不同就是幻读。幻读侧重的是某一次select操作得到的结果集的数据无法支撑后续的业务操作。
具体为:select某个记录显示不存在,然后准备insert[delete/update]时,发现该记录已经存在,而使得本次insert[delete/update]执行失败,无法插入。而此时就发生了幻读。
一个事务还没提交,它所做的更改就能被其他事务看到.
可能导致的一致性问题:脏读,不可重复读,幻读.
一个事务提交之后,它所做的变更其他事务才可以看到.
可能导致的一致性问题:不可重复读,幻读.
一个事务执行过程当中所看到的数据集,总是跟事务在启动的时候看到的保持一致.
并且在可重复读的隔离级别下,未提交变更对其他事务是不可见的.
可能导致的一致性问题:幻读.
通过加锁的方式避免的并发访问.没有一致性问题.
对同一行记录会加"写"锁,"读"会加读锁.当出现"读-写","写-写"锁重读的时候,后访问的事务就必须等待前一个事务执行完成,才能继续执行.
隔离界别 | 脏读 | 不可重复读 | 幻读 |
未提交度 | 可能 | 可能 | 可能 |
已提交度 | 不可能 | 可能 | 可能 |
可重复读 | 不可能 | 不可能 | 可能 |
串行化 | 不可能 | 不可能 | 不可能 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。