资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,数据隔离级别,隔离级别定义了事务与事务之间的隔离程度。,隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。,ANSI/ISO SQL92,标准定义了一些数据库操作的隔离级别:,未提交读(,read uncommitted,),提交读(,read committed,),重复读(,repeatable read,),序列化(,serializable,),通过一些现象,可以反映出隔离级别的效果。这些现象有:,更新丢失(,lost update,):当系统允许两个事务同时更新同一数据是,发生更新丢失。,脏读(,dirty read,):当一个事务读取另一个事务尚未提交的修改时,产生脏读。,非重复读(,nonrepeatable,read,):同一查询在同一事务中多次进行,由于其他提交事务所做的修改,每次返回不同的结果集,此时发生非重复读。,幻像(,phantom read,):同一查询在同一事务中多次进行,由于其他提交事务所做的插入或删除操作,每次返回不同的结果集,此时发生幻像读。,下面是隔离级别及其对应的可能出现或不可能出现的现象,脏读,: Mary,的原工资为,1000,财务人员将,Mary,的工资改为了,8000,,但未提交事务,Connection con1 =,getConnection,();,con.setAutoCommit(,false,);,update employee set salary = 8000 where,empId,=Mary;,与此同时,,Mary,正在读取自己的工资,Connection con2 =,getConnection,();,select salary,fromemployee,where,empId,=Mary; mit();,Mary,发现自己的工资变为了,8000,,欢天喜地! 而财务发现操作有误,而回滚了事务,Mary,的工资又变为了,1000 /con1 con1.rollback();,像这样,Mary,记取的工资数,8000,是一个脏数据。,READ_COMMITTED,保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。,不可重复读:,在事务,1,中,,Mary,读取了自己的工资为,1000,操作并没有完成,con1 =,getConnection,();,select salary from employee,empId,=Mary;,在事务,2,中,这时财务人员修改了,Mary,的工资为,2000,并提交了事务,. con2 =,getConnection,();,update employee set salary = 2000;,在事务,1,中,,Mary,再次读取自己的工资时,工资变为了,2000 /con1 select salary from employee,empId,=Mary;,在一个事务中前后两次读取的结果并不致,导致了不可重复读。 使用,REPEATABLE_READ,可以避免这种情况发生。,幻像读:,目前工资为,1000,的员工有,10,人。 事务,1,读取所有工资为,1000,的员工。,con1 =,getConnection,();,Select * from employee where salary =1000;,共读取,10,条记录 这时另一个事务向,employee,表插入了一条员工记录,工资也为,1000 con2 =,getConnection,();,Insert into,employee(empId,salary,) values(Lili,1000); mit();,事务,1,再次读取所有工资为,1000,的员工,/con1 select * from employee where salary =1000;,共读取到了,11,条记录,这就产生了幻像读。,ISOLATION_SERIALIZABLE,能避免这样的情况发生。但是这样也耗费了最大的资源。,大多数数据库的默认隔离级别为,:Read,Commited,如,Sql,Server,Oracle.,少数数据库默认的隔离级别为,RepeatableRead,如,MySQL,InnoDB,存储引擎,锁的概念,2-1,锁是数据库用来控制共享资源并发访问的机制。,锁用于保护正在被修改的数据,直到提交或回滚了事务之后,其他用户才可以更新数据,锁的概念,2-2,修改表,修改表,拒绝访问,Toy_ID,Name,Price,T001,Barbie,20,T002,GI Joe,45,锁定的优点,一致性,-,一次只允许一个用户修改数据,完整性,-,为所有用户提供正确的数据。如果一个用户进行了修改并保存,所做的修改将反映给所有用户,并行性,允许多个用户访问同一数据,Toy_ID,Name,Price,T001,Barbie,20,T002,GI Joe,45,修改表中,的数据,查看表中的数据,允许访问,表级锁,行级锁,锁的类型,锁的类型,行级锁,3-1,Toy_ID,Name,Price,T001,Barbie,20,T002,GI Joe,45,更新,T00,2,行,更新,T001,行,行被锁定,对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行,允许访问,行级锁,3-2,行级锁是一种排他锁,防止其他事务修改此行,在使用以下语句时,,Oracle,会自动应用行级锁:,INSERT,UPDATE,DELETE,SELECT FOR UPDATE,SELECT FOR UPDATE,语句允许用户一次锁定多条记录进行更新,使用,COMMIT,或,ROLLBACK,语句释放锁,行级锁,3-3,SELECT FOR UPDATE,语法,:,SELECT FOR UPDATE OF columnsWAIT n | NOWAIT;,SQL SELECT * FROM,order_master,WHERE,vencode,=V002,FOR UPDATE OF,odate,del_date,;,SQL UPDATE,order_master,SET,del_date,=28-8,月,-05,WHERE,vencode,=V002;,SQL COMMIT;,SQL SELECT * FROM,order_master,WHERE,vencode,=V002,FOR UPDATE WAIT 5;,SQL SELECT * FROM,order_master,WHERE,vencode,=V002,FOR UPDATE NOWAIT;,表级锁,3-1,Toy_ID,Name,Price,T001,Barbie,20,T002,GI Joe,45,修改表中的行,更新表,拒绝访问,锁定整个表,限制其他用户对表的访问。,表级锁,3-2,表级锁类型,行共享,行排他,共享,使用命令显示地锁定表,应用表级锁的语法是,:,LOCK TABLE,table_name,IN mode,MODE,;,共享行排他,排他,表级锁,3-3,行共享,(ROW SHARE) ,禁止排他锁定表,行排他,(ROW EXCLUSIVE) ,禁止使用排他锁和共享锁,共享锁,(SHARE),锁定表,仅允许其他用户查询表中的行,禁止其他用户插入、更新和删除行,多个用户可以同时在同一个表上应用此锁,共享行排他,(SHARE ROW EXCLUSIVE) ,比共享锁更多的限制,禁止使用共享锁及更高的锁,排他,(EXCLUSIVE) ,限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表,死锁,当两个事务相互等待对方释放资源时,就会形成死锁,Oracle,会自动检测死锁,并通过结束其中的一个事务来解决死锁,右边是一个死锁的例子,T,1,T,2,lock,(D,1,),时间,lock,(D,2,),lock,(D,2,),lock,(D,1,),等待,等待,
展开阅读全文