数据库事务管理

 

事务

“事务”是一个逻辑工作单元,它包括一系列的操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。事务包括4个基本特性,也就是我们常说的ACID,其中包括:
1.Atomic(原子性,这里的“原子”即代表事务中的各个操作不可分割)
事务中包含的操作被看作是一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。
2.Consistency(一致性)
一致性意味着,只有合法的数据才会被写入数据库,否则会回滚到最初状态。事务确保数据库的状态从一个一致状态转变为另一个一致状态。
3.Isolation(隔离性)
多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
4.Durability(持久性)
已被提交的事务对数据库的修改应该永久保存在数据库中。

并发事务处理下产生的意外情况
1.丢失更新
事务1:更新一条记录。
事务2:更新事务1处理中的记录。
事务1:调用commit进行提交。
事务2:调用commit进行提交。
此时事务1所做的修改完全被事务2的修改覆盖,称为丢失更新。
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。因为每个事务都不知道其它事务的存在,最后的更新将重写由其它事务所做的更新,这将导致数据丢失。

2.脏读(Dirty Read):一个事务读取到了另外一个事务没有提交的数据,所以你可能会看到一些最后被另一个事务回滚掉的数据。(读未提交)
事务1:更新一条记录。
事务2:读取事务1更新的记录。
事务1:调用commit进行提交或调用rollback进行回滚。
此时事务2读取到的数据是保存在数据库内存中的数据,称为脏读。读到的数据为脏数据

详细解释:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

3.不可重复读(NonRepeatable Read):在同一事务中,两次读取同一数据,得到内容不同。即一个事务再次读取之前曾经读取过的数据时,发现该数据已经被另一个已提交的事务修改。(读已提交)
事务1:查询一条记录。
事务2:更新事务1查询的记录。
事务2:调用commit进行提交。
事务1:再次查询上次的记录。
此时事务1对同一数据查询了两次,可得到的内容不同,称为不可重复读。

4.幻读(Phantom Read):同一事务中,用同样的操作读取两次,得到的记录数不相同。即一个事务重新执行一个查询,返回一批符合查询条件的记录,但这些记录中包含了因为其它最近提交的事务而产生的新记录。
事务1:修改表中所有记录
事务2:插入一条或一批记录
事务2:调用commit进行提交
事务1:再次查询表中所有记录
此时事务1两次查询到的记录是不一样的,称为幻读


详细解释:幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

posted on 2016-12-27 17:48  钟_小白  阅读(84)  评论(0)    收藏  举报

导航