欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

事务的隔离级别 博客分类: 数据库 事务数据库sql隔离ACID 

程序员文章站 2024-03-17 21:56:40
...

事务:由一系列操作组成的一个逻辑工作单元
          如,向账户中存入100元就是一个事务

事务类型:
1.自动提交,即执行完update马上保存数据
2.手动提交,执行update不保存数据,先放入
   缓存,只有执行commit,才保存数据

 

java代码:
conn.setAutoCommit(false);//设置手动提交,sql执行放入缓存
conn.commit();                    //手动提交,清空缓存,刷入数据库保存
conn.rollback();                  //回滚,清空缓存

---------------------------------------

事务的ACID属性:
    原子性(Atomicity) :
        事务是一个不可分割的工作单位,
        事务中的操作要么都发生,要么都不发生。
    一致性(Consistency) :
        事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
        (数据不被破坏)
    隔离性(Isolation):
        事务的隔离性是指一个事务的执行不能被其他事务干扰,
        即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,
        并发执行的各个事务之间不能互相干扰。
    持久性(Durability):
        持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,
        接下来的其他操作和数据库故障不应该对其有任何影响

-------------------------------------

 隔离的四个级别:对事物并发控制的四个等级。
 -串行化(序列化)(serializable)
  事务串行访问,不能并发访问
  所以不可能导致脏读、幻读、不可重复读

 -可重复读(repeatable read)
  不可能产生脏读、不可重复读,
  可能产生幻读。

 -读已提交(read committed)
  事务过程中不可能产生脏读了
  但可能产生不可重复读、幻读

 -读未提交(read uncommitted)
  能查到其他事务未提交的数据,可能导致脏、幻、不可重复读
  -------------------------------------------------
  *脏读(dirty read):当一个事务正在访问数据,并且对数据进行了修改,
     而这种修改还没有提交到数据库中,这时,
     另外一个事务也访问这个数据,然后使用了这个修改后的数据。
     即,读到未提交的数据。
  *幻读(phantom read):当第一个事务进行查询后,第二个事务对此数据执行了一个操作,
     当第二个事务未提交时,第一个事务的查询结果跟原来一样,即不会
     导致脏读。当第二个事务提交后,第一个事务的查询结果还是
     一样的,即不会导致不可重复读。
     当第一个事务对数据进行一次操作后,执行后的结果是建立在
     第二个事务操作后的,查询的结果是不可思议的,即幻读。
  *不可重复读(non-repeatable read):是指在一个事务内,多次读同一数据,
     在这个事务还没有结束时,另外一个事务也访问该同一数据。
     那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,
     那么第一个事务两次读到的的数据可能是不一样的。
-------------------------------------------------------

隔离级别  脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
读未提交(Read uncommitted) 可能 可能 可能
读已提交(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
串行化(Serializable ) 不可能 不可能 不可能

-----------------------------------------------------------------

1、mysql默认的隔离级别为Repeatable_Read
2、sqlserver 默认的隔离级别为Read Commited
3、oracle数据库支持READ COMMITTED和SERIALIZABLE两种事务隔离性级别,
     不支持READ UNCOMMITTED和REPEATABLE READ这两种隔离性级别,
     oracle数据库默认使用的事务隔离性级别却是READ COMMITTED.

--------------------------------------------------------

隔离操作的sql语句:
 
 查看提交模式
 select @@autocommit;
 0:表示手动提交
 1:自动提交

 begin           //开始一个事务
 rollback        //事务回滚
 commit          //提交事务

 *当set autocommit =0 后,所有的SQL都将做为事务处理,直
  到commit确认或rollback结束。
 *注意:当你结束这个事务的同时也开启了个新的事务

 查询当前事务的隔离级别
 select @@tx_isolation

 设置当前连接的隔离级别
 SET  TRANSACTION ISOLATION LEVEL 隔离级别

 设置数据库系统的全局的隔离级别
 SET  global  TRANSACTION  ISOLATION LEVEL 隔离级别