le):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大,通过选用不同的隔离等级就可以在不同程度上避免前面所提及的在事务处理中所面临的各种问题。所以,数据库隔离级别的选取就显得尤为重要,在选取数据库的隔离级别时,应该注意以下几个处理的原则:
首先,必须排除“未授权读取”,因为在多个事务之间使用它将会是非常危险的。事务的回滚操作或失败将会影响到其他并发事务。第一个事务的回滚将会完全将其他事务的操作清除,甚至使数据库处在一个不一致的状态。很可能一个已回滚为结束的事务对数据的修改最后却修改提交了,因为“未授权读取”允许其他事务读取数据,最后整个错误状态在其他事务之间传播开来。
其次,绝大部分应用都无须使用“序列化”隔离(一般来说,读取幻影数据并不是一个问题),此隔离级别也难以测量。目前使用序列化隔离的应用中,一般都使用悲观锁,这样强行使所有事务都序列化执行。
剩下的也就是在“授权读取”和“可重复读取”之间选择了。我们先考虑可重复读取。如果所有的数据访问都是在统一的原子数据库事务中,此隔离级别将消除一个事务在另外一个并发事务过程中覆盖数据的可能性(第二个事务更新丢失问题)。这是一个非常重要的问题,但是使用可重复读取并不是解决问题的唯一途径。
9、聚集索引与非聚集索引
聚簇索引是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、<、<=、& gt;、>=)或使用groupby或order by的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。




<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+CrnY09pteXNxbLXEy/fS/aOsv8nS1LLOv7zV4sDvoaO52NPaQiYjNDM7yve1xNStwO2/ydLUss6/vNXiwO88L3A+Cgo8cD4xMKGiyNXWvs7EvP4gcmVkbyC6zSB1bmRvtcTX99PDPC9wPgo8cD7U2srCzvFUv6rKvL+qyrzWrsewo6zI1da+1tDQtMjrvMfCvCZsdDtUIHN0YXJ0Jmd0O6Os1rTQ0Ln9s8zW0KOsVNa00NDIzrrOd3JpdGUoWCmy2df3x7DPyNKqz/LI1da+1tDQtMjrysq1sbXE0MK1xLzHwryjrLWxVMzhvbvKsaOsyNXWvtbQ0LTI67zHwrwmbHQ7VCBjb21taXQmZ3Q7o6zX3LXEwLTLtb7NysfPyNC0yNXWvqOsuvO4/NDCvMfCvKGjPC9wPgo8cD48aW1nIHNyYz0="https://www.cppentry.com/upload_files/article/57/1_0ezx1__.png" alt="">
在这里我们先说恢复的一般方法:
(1)正向扫描日志文件(从头到尾),找出故障发生前已经提交的事务(存在begin transaction和commit记录),将其标识记入重做(redo)队列。同时找出故障发生时未完成的事务(只有begin transaction,没commit),将其标识记入(undo)队列
(2)对undo队列的各事务进行撤销处理。进行undo的处理方法是,反向扫描日志文件,对每个undo事务的更新操作执行反操作,即将日志记录中“更新前的值”写入数据库。
(3)对重做日志中的各事务进行重做操作。进行redo的处理方法是,正向扫描日志,对每个redo事务重新执行日志文件登记操作。即将日志中“更新后的值”写入数据库。