数据库之事物隔离级别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

事务隔离级别(transaction isolation levels ):隔离级别就是对对事务

并发控制的等级。实现技术:为了实现隔离级别通常数据库采用锁(Lock ),一般在编程的时候只需要设置隔离等级,至于具体采用什么锁则由数据库来设置。。 分类:ANSI / ISO SQL 将其分为串行化(SERIALIZABLE )、可重复读(REPEATABLE READ )、读已提交(READ COMMITED )、读未提交(READ UNCOMMITED )四个等级。

串行化(SERIALIZABLE ):所有事务都一个接一个地串行执行,但不能并发执行。 这样可以避免幻读(phantom reads )。 实现技术:对于基于锁来实现并发控制的数据库来说,串行化要求在执行范围查询(如选取年龄在10到30之间的用户)的时候,需要获取范围锁(range lock )。如果不是基于锁实现并发控制的数据库,则检查到有违反串行操作的事务时,需要滚回该事务。

可重复读(REPEATABLE READ ):所有被Select 获取的数据都不能被修改。 这样就可以避免不可重复读(一个事务前后读取数据不一致的情况)。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。 实现技术:通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

读已提交(READ COMMITED ):被读取的数据可以被其他事务修改。

这样就可能导致不可重复读。也就是说,事务的读取数据的时候获取读锁,但是读完之后立即释放(不需要等到事务结束),而写锁则是事务提交之后才释放。释放读锁之后,就可能被其他事物修改数据。该等级也是SQL Server 默认的隔离等级。 实现技术:这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

事务隔离级

transaction isolation levels

串行化读取

SERIALIZABLE

可重复读REPEATABLE

读已提交 READ COMMITED 读未提交 READ UNCOMMITED

读未提交(READ UNCOMMITED):这是最低的隔离等级,允许其他事务看到没有提交的数据。这种等级会导致脏读(Dirty Read)。

允许脏读取,但不允许更新丢失。

实现技术:如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

综上述,可以等到下面的表格:

注:事物隔离级别是依据一个事物进行查询(Select,可能是一次或多次)时的数据是否“正确”为依据而定义的。(理解)

补充:

更新丢失(Lost update)

1、两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。

2、脏读:事物一读到了事物二尚未提交的数据(如果事物二失败回滚的情况下,则事物一读到的数据则是无效的,或者说垃圾)

产生级别:读未提交

解决需要级别:读已提交

3、不可重复读:事物一在二次或多次读取数据时,读到了不同的数据。原因是事物二在中间修改了其中的数据。

产生级别:读已提交

解决需要级别:可重复读

4、幻读:事物一修改了部分数据,事物二添加了新的并且符合事物一的条件的数据。造成事物一发现有新的数据没有修改,称幻觉。

产生级别:可重复读

解决需要级别:串行化

问题的提出

数据库是要被广大客户所共享访问的,那么在数据库操作过程中很事务隔离级别可能出现以下几种不确定情况。

更新丢失(Lost update)

两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。

脏读(Dirty Reads)

一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。

不可重复读(Non-repeatable Reads)

一个事务对同一行数据重复读取两次,但是却得到了不同的结果。它包括以下情况:(1)事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。

(2)幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。

相关文档
最新文档