日期:2014-05-18  浏览次数:20533 次

关于事务隔离级别与锁的问题
最近看了一下解决并发操作的问题

觉得可以用事务隔离级别与锁来实现(不知道这句话说得对不对)


那么事务隔离级别与锁来解决并发操作问题时的本质区别在哪?




------解决方案--------------------
事务隔离级别就是为了解决并发问题而存在的。。。。
------解决方案--------------------
探讨
最近看了一下解决并发操作的问题

觉得可以用事务隔离级别与锁来实现(不知道这句话说得对不对)


那么事务隔离级别与锁来解决并发操作问题时的本质区别在哪?

------解决方案--------------------
本来就是来解决并发问题的
------解决方案--------------------
访问和更改关系数据 -〉锁定:

隔离级别
当锁定用作并发控制机制时,它可以解决并发问题。这使所有事务得以在彼此完全隔离的环境中运行,但是任何时候都可以有多个正在运行的事务。

可串行性是通过运行一组并发事务达到的数据库状态,等同于这组事务按某种顺序连续执行时所达到的数据库状态。 

SQL-92 隔离级别
尽管可串行性对于事务确保数据库中的数据在所有时间内的正确性相当重要,然而许多事务并不总是要求完全的隔离。例如,多个作者工作于同一本书的不同章节。新章节可以在任意时候提交到项目中。但是,对于已经编辑过的章节,没有编辑人员的批准,作者不能对此章节进行任何更改。这样,尽管有未编辑的新章节,但编辑人员仍可以确保在任意时间该书籍项目的正确性。编辑人员可以查看以前编辑的章节以及最近提交的章节。

事务准备接受不一致数据的级别称为隔离级别。隔离级别是一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。应用程序要求的隔离级别确定了 SQL Server 使用的锁定行为。

SQL-92 定义了下列四种隔离级别,SQL Server 支持所有这些隔离级别: 

未提交读(事务隔离的最低级别,仅可保证不读取物理损坏的数据)。


提交读(SQL Server 默认级别)。


可重复读。


可串行读(事务隔离的最高级别,事务之间完全隔离)。 
如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。

下面四种隔离级别允许不同类型的行为。

隔离级别 脏读 不可重复读取 幻像 
未提交读 是 是 是 
提交读 否 是 是 
可重复读 否 否 是 
可串行读 否 否 否 


事务必须运行于可重复读或更高的隔离级别以防止丢失更新。当两个事务检索相同的行,然后基于原检索的值对行进行更新时,会发生丢失更新。如果两个事务使用一个 UPDATE 语句更新行,并且不基于以前检索的值进行更新,则在默认的提交读隔离级别不会发生丢失更新。



------解决方案--------------------
事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制,来解决并发问题。

锁是数据库并发控制的内部机制,是基础。当然,数据库同时还会利用行版本控制(SQL Server 2005 及以上)来进行并发控制;在数据库内部还使用闩(latch),互斥(mutex)等机制处理内部资源(如,缓存)的并发访问。

对用户来说,只有当事务隔离级别无法解决一些并发问题和需求时,才有必要在语句中手动设置锁。不适当的设置锁,可能会导致严重的阻塞和死锁。建议,只有在完全了解锁机制的情况下,才可以在语句中手动设置锁,否则应该使用事务隔离级别。

------解决方案--------------------
探讨
刚看到这句
锁定提示对SQL语句进行特别指定,这个指定将覆盖事务的隔离级别。


既然如此,为什么还要设置事务隔离级别?