Artificial Intelligence

Terminator:Skynet...010010001000010000010000100001000101010100101001010101001001010001001010000101001010101001010101010100101010100101001010100101001001010010100101100101010101011111010100101011101111

原创 数据库事务初探收藏

 使用事务级别要慎重:
 因为事务级别越高,数量越多、限制性更强的锁就会被运用到数据库记录或者表中。同时,更多的锁被运用到数据库和它们的覆盖面越宽,任意两个事务冲突的可能性就越大。
 如果有一个冲突(例如两个事务试图获取同一个锁),第一个事务必将会成功,然而第二个事务将被阻止直到第一个事务释放该锁(或者是尝试获取该锁的行为超时导致操作失败)。
 更多的冲突发生时,事务的执行速度将会变慢,因为它们将花费更多的时间用于解决冲突(等待锁被释放)。 
 ------------------------------------------------------

 TRANSACTION_NONE:
  正式地讲,TRANSACTION_NONE不是一个有效的事务级别。
  根据java.sql Connection API文件,这个级别表示事务是
  不被支持的,因此理论上说你不能使用TRANSACTION_NONE作
  为一个自变量赋给Connection.setTransactionIsolation()
  方法。事实上,虽然一些数据库实施了这个事务级别,但是
  Oracle9i却没有实施。


 脏读取(TRANSACTION_READ_UNCOMMITTE):表示,这个事务级别
  允许读取脏数据,什么是脏数据?就是指还没有提交的数据.
  因为这个级别,是允许一个事务(A)读取另一个事务(B)
  还没有提交的数据.一旦事务B发生异常退出.而修改了的数据
  却还没提交,或者新插入的数据和删除了的数据都还没有
  提交,导致事务A拿到了一些脏数据,或者错误数据;
  因此在这个事务级别里是会发生脏读,重复读,错误读取;

 禁止脏读(TRANSACTION_READ_COMMITTED):在这个级别中,事务A
  只能读取一些提交的数据,如事务B添加了一条记录,但是
  如果事务B没有提交,那么事务A是读不到的,所以该事务级别,
  把脏读给屏蔽掉了.---却允许重复读取,和错误读取.

  什么是重复读取呢?譬如,事务A读取了一个数据,这个数据
  的值为"helloworld",事务A准备利用这个数据来更新一下
  其他数据,但这个时候事务B开始对这个数据进行修改,并且
  提交---"hello 无名氏",由于是已经提交了,所以事务A是可以
  看到这个数据的,当事务A在没提交事务之前,它想看下数据
  是否正确,这个时候它发现,新读出的数据已经和原来的数据
  不一样了(这就是重复读取);

 允许重复读取(TRANSACTION_REPEATABLE_READ):在这个级别中,
  是禁止了脏读,和取消了不可重复读取,但是没有禁止错误读取;
  这个级别的事务比较严格,当一个事务A在读取一个值的时候
  是不允许另一个事务对该值进行修改的;

  为了允许重复读取,可以选用该级别,因为TRANSACTION_READ_
  COMMITED这个事务级别,是允许重复读取提交的数据的,如果
  事务A在读取一个数值的时候,值为"Hello World!",但这个时
  候事务B对"Hello World"值进行修改了,改为"Hello EveryOne"
  然后提交,当事务A再次去读取这个值的时候,去发现原来读到
  的值改变了,变成了"Hello EveryOne",为了防止出现这种情况
  可以禁止重复提交,目的是为了重复读取不会出错!那么这个
  时候就可以选择TRANSACTION_REPEATABLE_READ这个级别,
  这个级别就是用来禁止重复提交的.


  虽然这个时候是禁止了重复提交,但却可以添加删除,
  比如事务A,作了个查询语句"select * from 无名氏 "; 这个时候是允许事务B做这样的操作的:
  "insert into 无名氏 values(2,'aaa')"; 这个时候,
  事务A再次做读取操作的时候,却发现数据莫名其妙的
  多了一条,这就是所谓的---幻影读取;


 禁止幻读(TRANSACTION_SERIALIZABLE):事务的最高级别(串行化
  操作)事务级别最高,所耗费的性能也越多.
  禁止幻读禁止了脏读,禁止了重复提交和幻读.
  也就是当事务A在按条件查询的时候,事务A一旦没有提
  交,任何事务都不能对事务A的资源进行操作--- 保证
  事务A的操作真正的原子性!


 注意:在Oracle中只支持两种级别:

  TRANSACTION_READ_COMMITTED(默认的级别)(只有提交后
     才可以读取)而每一个终端进行自己的DML操作 都自动开启了一个事务

  TRANSACTION_SERIALIZABLE(窜行化操作)

      在mssql/mysql的都是 默认为自动提交事务---一执行了一条DML操作就马上提交了!

      要是想使用事务必须用begin trans

 

发表于 @ 2006年08月06日 15:35:00|评论(loading...)

新一篇: JDBC驱动程序的4种类型 | 旧一篇: 学习笔记-JSTL标签库--C SQL

用户操作
[即时聊天] [发私信] [加为好友]
Terminator:Skynet
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
Terminator:Skynet的公告
ID: kj021320
Name: Skynet(AI)
QQ: 282720807
mail:kj021320_126.com
mail:kj021320_gmail.com
http://blog.csdn.net/I_S_T_O/
艾尔斯帝欧
文章分类
收藏
    ISTO成员
    AMXSA's BLOG--PHP高手
    I.C.E'blog一位网络高手
    LIVING's BLOG
    MASK's BLOG--- ASP/Delphi
    SUMMER--搜索引擎开发者
    Security
    milw0rm
    red database security
    技术
    Ada Joint Program Office
    ADA Program Language
    ALL jar download
    BEA DOCUMENTS
    Caucho Technology
    codeproject
    CURL WEB Program language
    D language document
    Documentation at PDC
    Firebird Documentation
    Flex LiveDocs
    FreeBSD Document
    FreeMarker template engine
    hadoop分布式
    IBM informix文档中心
    IBM RedBooks Search
    InternetEngineeringTaskForce
    jakarta-apache.LOG4J
    jcaptcha
    LINUX Documentation
    MIT's OpenCourseWare
    MSDN WEBCAST
    MySQL Reference Manual
    nokia sdk document
    novell-documentation
    ORACLE documentation
    Perl Documentation
    PHP.net Document
    planet-source-code
    PostgreSql Document
    Python Documentation
    reflector
    SapDB documentation
    SourceForge
    SQLite cn
    Sybase Online Document
    teradata Resources
    Velocity Java template engine
    WebWork - Documentation
    Web标准组织
    看雪学院
    美国基因组研究所
    友情连接
    ADK成员-C#
    K' 同学的BLOG
    NetMiner's BLOG
    rainnyzhong--ORACLE
    一个忘不了的好友,我的领路人
    忍者's BLOG
    精灵
    黑客榜中榜
    存档
    软件项目交易
    Csdn Blog version 3.1a
    Copyright © Terminator:Skynet