根据sqlserver支持的四种事物隔离级别,分别开两个客户端,按照4种问题的现象描述构造sql语句,很容易重现的。自己动手实践一下,对事物的理解很有帮助。建议楼主自己做。
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
脏读:对于两个事物T1,T2,T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取的内容就是临时且无效的
不可重复读:对于两个事物T1,T2,T1读取了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了
幻读:对于两个事物T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行之后,如果T1再次读取同一个表,就会多出几行
数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题
一个事务与其他事务隔离的程度称为隔离级别数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱
数据库提供了4中隔离级别:
隔离级别描述
READUNCOMMITTED(读未提交数据)允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读的问题都会出现
READCOMMITED(读已提交数据)只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然会出现
REPEATABLEREAD(可重复读)确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题依然存在
(串行化)确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除 *** 作,所有并发问题都可以避免,但性能十分低
Oracle支持的2种事务隔离级别:READCOMMITED,Oracle默认的事务隔离级别为:READCOMMITED
Mysql支持4中事务隔离级别Mysql默认的事务隔离级别为:REPEATABLEREAD
就是事务完整性受到了破坏
一般现在主流的数据库比如oracle,db2都会通过锁机制来减少脏数据的产生
就是不同session之间由于某个seesion对表进行 *** 作而影响其他session的查询结果
一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。
注意,该协议是规定在修改数据R之前必须加锁。所以如果事务T仅是读数据而不对其进行修改,是不需要加锁的;事务T在修改R之前,其他事务是能对R进行读取的,所以它不能保证可重复读和不读“脏”数据。
以上就是关于数据库脏读问题全部的内容,包括:数据库脏读问题、SQL中脏数据是啥意思(脏数据是指什么)、数据库中用户对‘脏数据’的读出是什么规则收到了破坏等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)