事务中的持久性 和 突然断电
事务中的持久性:由于性能的原因事务操作中,并不是数据每次被修改后立即被写入磁盘,那么当被修改后的数据存在中缓存中,但尚未写入磁盘中时,突然断电后会导致缓存中的数据丢失,那当恢复供电后,如何保证被那部分被修改后的数据能够正确写入磁盘?
还需补充一点是:事务的提交操作也不是把事务修改的数据直接写入磁盘,那当事务已提交后,那还未被写入硬盘,这时停电了,恢复供电后,如何保证被那部分被修改后的数据能够正确写入磁盘,此时缓存中的数据应该因为停电而消失了吧?
------解决方案--------------------
1:突然断电后会导致缓存中的数据丢失,那当恢复供电后,如何保证被那部分被修改后的数据能够正确写入磁盘: 这个就需要数据库的前滚,因为实物已经被提交,而且说明事物已经记完了日志信息,当数据库重新启动的时候,数据库会根据在线重做日志对数据做前滚。
2:你的补充问题也是一样,事务提交后,并不一定马上写回磁盘,但是你事务提交前,肯定会先记录在线日志,只要你的在线重做日志不被删除数据库在启动后,会根据你的日志信息前滚,不会出现任务错误,错误只可能你操作sql写错的,系统是不会弄错的。
------解决方案--------------------
事务只是用来保证数据一致性,并非保证信息完成,如果应用程序发生一个事务操作,这个事务要么成功,要么失败,事务操作成功后,数据库会在联机重做日志中产生检查点,检查点信息会立即存盘。如果事务失败,或者事务提交前数据库断电,应用程序收不到事务成功消息,就要进行异常处理。
------解决方案--------------------在oracle中事务具有4个特性:
1、原子性:事务的原子性是指事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的。
例如:A帐户向B帐户划账1000,则先将A减少1000,再将B增加1000,这两个动作要么都提交,要么都回退,不可能发生一个有效、一个无效的情况。
2、一致性:一致性是指数据库在事务操作前和事务处理后,其中的数据必须都满足业务规则约束。
例如:A、B帐户的总金额在转账前和转帐后必须一致,其中的不一致必须是短暂的,在事务提交前才会出现的。
再如:约定B帐户不能多于1000元,则A转出1000成功,B转入1000失败,最终由原子性得到——整个事务回滚
3、隔离性:隔离性是数据库允许多个并发事务同时对齐数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
例如:在A、B之间转帐时,C同时向A转帐,若同时进行则A、B之间的一致性不能得到满足。所以在A、B事务执行过程中,其他事务不能访问(修改)当前相关的数值。
4、持久性:持久性表示为:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
在提交之前如果系统故障,则所有信息全部丢失。
提交之后数据存放在磁盘中,是永久性的。
楼上说的 “事务只是用来保证数据一致性” 未免有点大言不惭的感觉,所以还请把问题看清楚在回答问题,不要让人家误解,那就不好了。