首页 > 数据库 > 数据库开发技术 > 并发控制 和 隔离级别
事务的隔离级别
什么是脏数据,脏读,不可重复读,幻觉读,更新丢失………
脏读:
脏读就是指当一个事务T1正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务T2也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
Db: studentno=13
T1 : update table_name set colunmn studentno=11 where 字句
T2 select * from table_name where studentno<12;
T1 : rollback
T2 脏数据
不可重复读:
不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
不可重复读,是指在是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
T1 : select * from table1
T2:update table1 set column=**;
T1 : Select * from table1
幻觉读:
幻觉读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
T1:update table2 column1=15;
T2:insert into table2 values(16);
T1认为幻觉读
● 更新丢失(Lost update):两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。
● 脏读(Dirty Reads):一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。
● 不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。例如,在两次读取的中途,有另外一个事务对该行数据进行了修改,并提交。
● 两次更新问题(Second lost updates problem):无法重复读取的特例。有两个并发事务同时读取同一行数据,然后其中一个对它进行修改提交,而另一个也进行了修改提交。这就会造成第一次写操作失效。
● 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。
隔离级别:
可重复读: repeatable read RR
是最严格的隔离级别,一个事务完全与其他事务隔离,不可能出现脏读、不可重复读、幻像读线上 事务期间锁定事务以任何方式引用的所有行。
读稳定性 read stability RS
没有将事务和其他事务完全隔离,可以防止脏读和不可重复读,可能出现幻象读,只是锁定实际检索和修改的行。 提高了较高的数据并行姓和稳定的数据视图。优化器需保证在锁定升级前不获取表级升级。
适用以下应用程序:
在并发环境下运行
需要限定某些行在工作单元运行期间保持稳定
在工作单元内不会发出多次相同的查询,或者发出多次查询时,允许结果不一样
游标稳定性 cursor stability CS
可以防止脏读
通过游标从表中检索数据的时候,其他事务不能更新或删除游标所引用的行,但是被锁定的行本身不是通过索引访问的,那么其他事务也可以将新的行添加到表中,以及对被锁定行前后的行进行更新和删除操作。所获取的锁一直有效直到事务结束或者游标重定位,。如果事务修改了他检索到的任何行,那么在事务终止之前,其他事务不能更改和删除该行,即使游标不再位于被修改的行。
默认级别,可能会出现不可重复读和幻象读现象,建议在需要最大并行性,但只看到其他应用程序中已落实行的情况下使用。
未提交读 uncommitted read UR
最不严格,实际上在使用这个隔离级别时,只有当另一个事务视图删除和更改被检索行所在的表时,才会锁定该检索的行。访问只读表和视图的事务。
隔离级别 | 访问未落实的数据 脏数据 | 不可重复读 | 幻像读现象 |
RR | No | No | No |
RS | No | No | Yes |
CS | No | Yes | Yes |
UR | Yes | Yes | Yes |
选择隔离级别的准则
应用程序类型 | 高数据稳定性 | 不需要高数据稳定性 |
读写事务 | RS | CS |
只读事务 | RR RS | UR |
对于嵌入式的SQL应用程序 使用precompile或bind命令制定isolation选项设置隔离级别
Odbc CLI调用级接口 通过调用制订了sql_attr_txn_isolation的连接属性sqlsetconnectattr()设置,也可以通过db2cli.ini指定。配置文件的txnisolation
Jdbc sqlJ应用程序,通过db2的java.sql的settransationisolation()
Db2 change isolation to ur
Db2 connect reset
Db2 change isolation to ur
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24386451/viewspace-1036370/ ,如需转载,请注明出处,否则将追究法律责任。