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代替。