码迷,mamicode.com
首页 > 数据库 > 详细

数据库事务隔离和锁

时间:2014-12-31 11:18:24      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

概述

       数据库事务隔离和锁的东西,学习了一下,现讲解一下自己的理解


数据库事务隔离

       概念

              事务:把多条sql语句作为一个整体和数据库交互。这里需要注意,一个事务可有多条SQL语句,虽然这些SQL语句最终的结果变成一个整体,要成功都成功,要失败都失败,但是,里面的每条SQL语句却是单条执行的。

              数据库事务隔离:讲的是多个事务(操作同一张表)之间,一个事务内部单条select语句执行的结果在其他事务中的时机。

       事务隔离级别

               Read Uncommitted:读未提交,事务中的select语句查询表的结果是,其他事务未提交的时刻,即,事务1对表1的select,查到了事务2的Update语句的结果,虽然,事务2中update之后的语句还没有执行。

               Read Committed:读已提交,事务1对表1的select,查到的结果是其他对表1以commit的事务,实机是其他事务执行完成,对于其中途的更新,事务1不会读到结果。

               Repeatable table:可重复读,事务1中对表1的select读到的结果是不变的,注意,如果读后有更新操作,并且又读表1,那么,此时读到的是已提交的数据,所以,这个隔离级别有可能产生幻读(后面讲这个概念)。

               Serializable:序列化,事务的各种问题,都是因为数据库允许多个事务可以并行执行,但是,如果我们让数据库串行执行事务,那么不就什么问题都没有了嘛,Serializable就是这个隔离级别


脏读、幻读、可重复读和不可重复读

       这些概念的产生也是因为多个事务并发产生的,所以,在理解这些内容的时候,一定要想着多个事务同时执行的这么一个情况。

       脏读:事务1对表1的select查询(一条记录),读取的是事务2对表1(该条记录)update结果后的内容,此时,事务2回滚,此时事务1读到的数据就是脏数据,称此为脏读,即:这条记录的内容是不真实的。

       幻读:事务1对表1的select查询获得结果(一条记录)后,事务2对表1insert一条记录,然后,事务1又使用该select语句查询结果(两条记录),发现信息量的变了,称此为幻读,即:原信息内容没有变,但是量不同了。

       重复读:事务1对表1的select查询得到结果后,这个结果是在之后的select查询是不变的(之前没有更新语句) ,称此为重复读。不可重复读与之相反。


数据库锁

       关于数据库锁的内容,只讲解共享锁,更新锁和排它锁的特性。

       共享锁、更新锁和排它锁之间的关系

              单个资源可以有多个共享锁;单个资源有了排他锁后,不可以加其它的锁;单个资源上有了其它锁(共享锁或更新锁)后,不可以再给这个资源直接加上一个排它锁;单个资源只能有一个更新锁;单个资源可以在有更新锁的同时,再给资源加上共享锁,并且,之后,这个资源的更新锁可以在这个共享锁存在的时候进行升级,转换为排它锁;

        死锁

               单个SQL语句都具有锁,默认的select语句执行时,给资源加了共享锁,一旦select执行完成,那么这个共享锁也就没有了,即使默认select语句在事务中,此时易造成一个死锁,那就单个select执行的时间太长,并且执行的次数多,这个时候,表内容的更新就会等,等到表中一个共享锁都没有的时候才可以执行,这种情况的执行我们可以使用单条select不加共享锁的语句解决。

               更新的SQL语句加的为排它锁,当更新语句在事务中时,就会把锁的生命周期变成和事务一样的长,此时需要注意,访问资源的顺序,可能会造成死锁的问题。


总结

       上面的内容不是很完整,例如:事务的隔离级别对脏读、幻读和不可重复读的影响。死锁的那块内容下去可以接在SQL Server上做实验。

数据库事务隔离和锁

标签:

原文地址:http://blog.csdn.net/jiben2qingshan/article/details/42284011

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!