数据库事务整理

  1.首先是事务的概念:是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。举个例子:比如银行转账问题,A给B转账100块钱,应该是要分为两步操作,第一显示A的余额-100,再就是B的余额+100,这两个操作要么都成功,要不都不能成功,这两个操作是一个不可拆分的,也就是下面说的原子性。

  2.再就是事务的四大特性:原子性,一致性,隔离性,持久性。

  3.如果在没有多线程控制机制的情况下,多个事务并发执行,会发生以下几个问题:

    脏读:A事务读取数据库的某条记录,但是这条记录是B事务更新未提交的,所以,A事务读取的数据很可能因为B事务回滚而导致数据不正确。

    不可重复读:A事务连续读取数据库的某条已被提交的记录,但是B事务在A事务读取的间隙又对该记录更新并提交了,A事务读取的多次数据就会不正确。

    幻读:

  4.对于处理以上四种情况,有四个级别的处理方案:Read Uncommitted,Read Committed,Repeatable Read,serializable(读未提交、读已提交、可重复读、串行化)

    Read UnCommitted:事务的各种问题均无法避免,因为数据库允许某事物读取未提交的数据。

    Read Committed: 可以防止脏读,因为数据库只允许事务读取的时候读取已提交的数据,因此数据库不得不采用锁,此级别锁行。

    Repeatable Read:可以防止脏读和不可重复读问题,因为此级别下某事物读取数据将会禁止写数据的其他事务(但允许读事务),写事务则禁止任何其他事。

    Serializable: 最狠的一种,要求每个事务已串行化的方式进行执行,A事务不结束B事务不能开始,知道A事务完成才行。

    注意:四大隔离级别从上到下越来越安全,安全的代价就是性能,为了防止多线程事故,数据库只能加锁,这就限制了性能,而且还可能出现死锁,所以

    选用隔离级别的候要小心选用。

  5.常见数据库的隔离级别

    mysql具有四大隔离级别,默认为Read Committed,设置隔离级别语句为:

    SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

    Oracle中只有两隔离级别:Read Committed和Serializable,默认为Read Committed。

posted @ 2016-08-22 10:34  洞拐洞拐  阅读(196)  评论(0编辑  收藏  举报