sql学习总结(9)——事务处理和优化查询技术

9.1事务的设置与提交

 

较低的隔离级别可以增加并发,但会出现脏数据,降低数据的正确性。较高的隔离级别可以保证数据的正确性,但会降低并发,即影响程序的运行速度,并且易死锁。

SQL Server支持4种隔离级别:未提交读(read uncommitted)相当于NOLOCK、提交读(read committed)默认选项值、可重复读(repeadable read)、可串行读(serializable)。

设置事务隔离级别

set transaction isolation level

repeatable read

 

开始事务

begin transaction

 

事务执行代码

select * from 职工 where 职工号 in

(select 职工号 from 订购单 where 金额>15000)

and 仓库号 in (select 仓库号 from 仓库 where 城市!=’青岛’)

and 工资>1500

 

提交事务 commit transaction

 

9.2回滚事务

语法格式:

rollback{tran | transaction}

[transaction_name | @tran_name_variable | savepint_name | @savepoint_variable]

begin transaction update_data

update 职工 set 姓名=’事务修改’ where 职工号=’zg2’

rollback transaction update_data

 

9.3保存事务

语法格式:

save{tran | transaction} {savepoint | @savepoint_variable}

注意:当事务开始后,事务期间处理期间使用的资源将一直保留,直到事务完成(也就是锁定)。当将事务的一部分回滚到保存点时,将继续保留资源直到事务完成(或者回滚整个事务)

 

9.4事务中锁的应用

共享锁(S):select

排它锁(X):insert、delete、update,排它锁就不能有共享锁。

死锁:不可避免。

1.当两个事务同时锁定了两个单独的对象,这时每一个事务都要求在另外一个事务锁定的对象上获得一个锁,因此每一个事务都必须等待另一个事务释放占有的锁。

2.当一个数据库中,有若干个长时间运行的事务执行并发操作。

 

9.5优化查询

1.在大部分情况下,where条件语句中包含or、not,SQL将不使用索引;可以用in代替or,用比较运算符!=代替not。

2.在没有必要显示不重复运行时,不使用distinct关键字,避免增加处理时间。

3.当使用and运算符查找某个范围内的数据时,一般不使用索引,可以用between代替。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。