数据库事务管理基础知识
时间:2011-03-04 来源:God bless you
事务管理概述
“事务”是一个逻辑工作单元,它包括一系列的操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。事务包括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两次查询到的记录是不一样的,称为幻读
详细解释:幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
事务隔离等级
为了避免并发事务处理下产生的意外情况,标准SQL规范定义了4中事务隔离等级。
1.Read Uncommitted
最低等级的事务隔离,直译就是读“未提交”,意思就是即使另一个并发事务还没有提交,当前事务也能读到这个改变,这是很不安全的。Read Uncommitted允许脏读,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。
此级别的事务隔离等级对于大多数逻辑严格的应用系统而言是难以接受的,脏读取的出现将为系统的并发逻辑带来极大隐患。
2.Read Committed
直译就是读“提交”,意思就是一个事务不会读到另一个事务已修改但未提交的数据。Read Committed允许不可重复读取,但不允许脏读取。读取数据的事务允许其他并发事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
此级别的事务隔离等级是最常用的,并且是大多数数据库的默认隔离级别,同时也适用于大多数系统。
3.Repeatable Read
直译就是“可重复读取”,这就是说同一事务先后执行相同查询语句的时候,得到的结果是一样的。这也意味着一个事务不可能更新已经由另一个事务读取但未提交(回滚)的数据。Repeatable Read禁止不可重复读取和脏读,但是有时可能出现幻读。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
4.Serializable
最高等级的事务隔离级别,也提供了最严格的隔离机制。直译就是“序列化”,意思是说这个事务执行的时候不允许别的事务并发执行。Serializable提供严格的事务隔离级别,可以防止脏读,不可重复读取和幻读,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。