事务的隔离级别(zz)
SQL语句可以使用SET TRANSACTION ISOLATION LEVEL来设置事务的隔离级别。 1. Read Uncommitted:最低等级的事务隔离,仅仅保证了读取过程中不会读取到非法数据。上诉4种不确定情况均有可能发生。 2. Read Committed:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。 第一个查询事务 SET TRANSACTION ISOLATION LEVEL Read Committed begin tran update Cate SET Sname=Sname+'b' where ID=1 SELECT * FROM cate where ID=1 waitfor delay '00:00:6' rollback tran --回滚事务 select Getdate() SELECT * FROM cate where ID=1 第二个查询事务 SET TRANSACTION ISOLATION LEVEL Read committed --把committed换成Read uncommitted可看到“脏读取”的示例。 SELECT * FROM cate where ID=1 select Getdate() 可以看到使用 Read Committed 成功的避免了“脏读取”. 3. Repeatable Read:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。 第一个查询事务 SET TRANSACTION ISOLATION LEVEL Repeatable Read -- 把Repeatable Read换成Read committed可以看到“不可重复读取”的示例 begin tran SELECT * FROM cate where ID=33 --第一次读取数据 waitfor delay '00:00:6' SELECT * FROM cate where ID=33 --第二次读取数据,不可重复读取 commit 第二个查询事务 SET TRANSACTION ISOLATION LEVEL Read committed update cate set Sname=Sname+'JD' where ID=33 SELECT * FROM cate where ID>30 4. Serializable:最高等级的事务隔离,上面3种不确定情况都将被规避。这个级别将模拟事务的串行执行。 在第一个查询窗口执行 SET TRANSACTION ISOLATION LEVEL Serializable -- 把Serializable换成Repeatable Read 可看到“幻像读”的示例 begin tran SELECT * FROM cate where ID>30 --第一次读取数据,“幻像读”的示例 waitfor delay '00:00:6' --延迟6秒读取 SELECT * FROM cate where ID>30 --第一次读取数据 commit 第二个查询事务 SET TRANSACTION ISOLATION LEVEL Read committed Delete from cate where ID>33 SELECT * FROM cate where ID>30 创建事务 设置事务级别:SET TRANSACTION ISOLATION LEVEL |
深圳A8数据分析处理工作室
咨询热线:
137-143-400-99
地址:深圳市南山区科技园南区软件园 http://www.HiA8.cn