2011-9-16 jdbc

来源:互联网 发布:php 微信开发流程 编辑:程序博客网 时间:2024/03/28 18:16
 

                 2011-9-16   结果集       阴  

      今天的考试过去了,之后大家其实都有点想法吧.每次考试之后都会明白自己没有好好努力.我是该好好检讨吧.其实我们的世界一直是这样的,没有做什么和做了什么总会被检测出来的.好好的过日子,明天的明天的明天总会有我们想想要的.现在要做的就是自己耐心的等待,慢慢的积蓄.

    ACID原则

事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。

Ø 原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。

Ø 一致性(Consistency):当事务完成时,数据必须处于一致状态。

Ø 隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务

Ø 永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性。

事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示并发事务是彼此隔离。持久性表示当系统或介质发生故障时,确保已提交事务的更新不能丢失。持久性通过数据库备份和恢复来保证。

数据库并发问题数据时可能会发生问题。并发问题包括:

当多个用户并发访问数据库中相同的数据时,可能会出现并发问题。

如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的

 1. 丢失或覆盖更新。

2. 未确认的相关性(脏读)。

 3. 不一致的分析(非重复读)。

 4. 幻读。

丢失更新

当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其他事务的存在。最后的更新将重写由其他事务所做的更新,这将导致数据丢失。

例如,两个编辑人员制作了同一文件的电子复本。每个编辑人员独立地更改其复本,然后保存更改后的复本,这样就覆盖了原始文件。最后保存其更改复本的编辑人员覆盖了第一个编辑人员所做的更改。如果在第一个编辑人员完成之后第二个编辑人员才能进行更改,则能避免该问题。

未确认的相关性(脏读)

当第二个事务选择其他事务正在更新的行时,会发生未确认的相关性问题。第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。

例如,一个编辑人员正在更改电子文件。在更改过程中,另一个编辑人员复制了该文件(该复本包含到目前为止所做的全部更改)并将其分发给预期的用户。此后,第一个编辑人员认为目前所做的更改是错误的,于是删除了所做的编辑并保存了文件。分发给用户的文件包含不再存在的编辑内容,并且这些编辑内容应认为从未存在过。如果在第一个编辑人员确定最终更改前所有人都不能读取更改的文件,则能避免该问题。

不一致的分析(非重复读)

当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。不一致的分析和未确认的相关性类似,因为其他事务也是正在更改第二个事务正在读取的数据。然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其他事务更改;因而该行被非重复读取。

例如,一个编辑人员两次读取同一文件,但在两次读取之间,作者重写了该文件。当编辑人员第二次读取文件时,文件已更改。原始读取不可重复。如果只有在作者全部完成编写后编辑人员才能读取文件,则能避免该问题。

. 幻像读

当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其他事务删除。同样,由于其他事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。

例如,一个编辑人员更改作者提交的文件,但当生产部门将其更改内容合并到该文件的主复本时,发现作者已将未编辑的新材料添加到该文件中。如果在编辑人员和生产部门完成对原始文件的处理之前,所有人都不能将新材料添加到文件中,则能避免该问题。

二、 并发问题的解决方案

当锁定用作并发控制机制时,他能解决并发问题。这使所有事务得以在彼此完全隔离的环境中运行,不过所有时候都能有多个正在运行的事务。可串行性是通过运行一组并发事务达到的数据库状态,等同于这组事务按某种顺序连续执行时所达到的数据库状态。

 

隔离级别

 

尽管可串行性对于事务确保数据库中的数据在所有时间内的正确性相当重要,然而许多事务并不总是需求完全的隔离。例如,多个作者工作于同一本书的不同章节。新章节能在任意时候提交到项目中。不过,对于已编辑过的章节,没有编辑人员的批准,作者不能对此章节进行所有更改。这样,尽管有未编辑的新章节,但编辑人员仍能确保在任意时间该书籍项目的正确性。编辑人员能查看以前编辑的章节及最近提交的章节。

事务准备接受不一致数据的级别称为隔离级别。隔离级别是个事务必须和其他事务进行隔离的程度。较低的隔离级别能增加并发,但代价是降低数据的正确性。相反,较高的隔离级别能确保数据的正确性,但可能对并发产生负面影响。

sql-92 定义了下列四种隔离级别:

Ø 未提交读(事务隔离的最低级别,仅可确保不读取物理损坏的数据)。

Ø 提交读(sql server 默认级别)。

Ø 可重复读。

Ø 可串行读(事务隔离的最高级别,事务之间完全隔离)。

如果事务在可串行读隔离级别上运行,则能确保所有并发重叠事务均是串行的。

下面四种隔离级别允许不同类型的行为。如表所示:

隔离级别

脏读

不可重复读

幻读

未提交读

提交读

可重复读

可串行读

事务必须运行于可重复读或更高的隔离级别以防止丢失更新。当两个事务检索相同的行,然后基于原检索的值对行进行更新时,会发生丢失更新。如果两个事务使用一个 update 语句更新行,并且不基于以前检索的值进行更新,则在默认的提交读隔离级别不会发生丢失更新。

JDBC事务管理

提交和回滚:

在JDBC的数据库操作中,一项事务是由一条或是多条表达式所组成的一个不可分割的工作单元。我们通过提交commit()或是回退rollback()来结束事务的操作。关于事务操作的方法都位于接口java.sql.Connection中。

首先我们要注意,在JDBC中,事务操作默认是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作。操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回退。

其次,在JDBC中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交。倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生响应的异常。此时就可以在异常捕获时调用rollback()进行回退。这样做可以保持多次更新操作后,相关数据的一致性。