事务隔离级别

参照:
并发操作的一致性问题
标准SQL规范中定义的四个事务隔离级别
锁的用处及脏读、不可重复读和幻觉读的概念


脏读 :当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
    因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

脏读 (这个说法比较好): 读"脏"数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤消,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为"脏"数据,即不正确的数据。

不可重复读 :在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。
    这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

幻觉读(虚读、幻影读) :当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。
    那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。   

丢失的修改    

基本的封锁类型有两种 :排它锁(Exclusive locks 简记为X锁)和共享锁(Share locks 简记为S锁)。

java语言的隔离级别:(JDBC中的)




以下说明了隔离级别:
static int TRANSACTION_NONE
          指示事务不受支持的常量。

static int TRANSACTION_READ_UNCOMMITTED
          指示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量。
static int TRANSACTION_READ_COMMITTED    ========默认级别多是这个==========
          指示防止发生脏读的常量;不可重复读和虚读有可能发生。
static int TRANSACTION_REPEATABLE_READ
          指示防止发生脏读和不可重复读的常量;虚读有可能发生。
static int TRANSACTION_SERIALIZABLE
          指示防止发生脏读、不可重复读和虚读的常量。


在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同:
  ◆未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
  ◆授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
  ◆可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
  ◆序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

读操作未提交(Read Uncommitted)
读操作已提交(Read Committed)
可重复读(Repeatable Read)
可序列化(Serializable)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值