最近数据库增加了些不可避免的触发器(程序无法修改)。
所以有时并发量高时出现了死锁。我如果直接把数据库隔离等级改为快照,这样做的副作用是什么呢?
请高手指点。
所以有时并发量高时出现了死锁。我如果直接把数据库隔离等级改为快照,这样做的副作用是什么呢?
请高手指点。
解决方案 »
- mysql如何替换语句中从几到几个字符?
- 当数据量大的时候发现用现在的存储过程和函数好慢呀!有办法解决吗?请高手指点!
- 请问mssql中如何取小数点后一位?如86.65取86.7;86就取86
- 希望利用存储过程动态创建表,有人能实现吗
- 为什么同一条插入语句,在存储过程中执行,再查看表却没有这条记录(但标识ID已暗自动加上1了),在企业管理器的表的查询中执行,却能看到这条
- 请问如何将数据库中的表批量改名?
- Sql 问题 请各位大虾解决下
- 在函数里面不可以调用存储过程吗?
- sql server中怎么返回表中的列的数目
- 一個值得高手們注意的SQL問題.(高分相送!)
- 高手请进! 高频率,CRUD操作的问题.
- 请教一个sql语句,在线等
快照隔离级别使用行版本控制来提供事务级别的读取一致性。读取操作不获取页锁或行锁,只获取 SCH-S 表锁。读取其他事务修改的行时,读取操作将检索启动事务时存在的行的版本。将 ALLOW_SNAPSHOT_ISOLATION 数据库选项设置为 ON 时,将启用快照隔离。默认情况下,用户数据库的此选项设置为 OFF。
注意:
SQL Server 不支持元数据的版本控制。因此,对于在快照隔离下运行的显式事务中可以执行的 DDL 操作存在限制。在快照隔离下,BEGIN TRANSACTION 语句之后不允许使用任何公共语言运行时 (CLR) DDL 语句或下列 DDL 语句:ALTER TABLE、CREATE INDEX、CREATE XML INDEX、ALTER INDEX、DROP INDEX、DBCC REINDEX、ALTER PARTITION FUNCTION、ALTER PARTITION SCHEME。在隐式事务中使用快照隔离时允许使用这些语句。根据定义,隐式事务为单个语句,这使得它可以强制应用快照隔离的语义,即便使用 DDL 语句也是如此。违反此原则会导致错误 3961:“数据库 '%.*ls' 中的快照隔离事务失败,因为自此事务启动后,该语句所访问的对象已由其他并发事务中的 DDL 语句修改。这是不允许的,因为未对元数据进行版本控制。如果与快照隔离混合,对元数据的并发更新可能导致不一致。”
帮忙看看呢。后来加了 修改时间 这个字段,但是不能改程序。
这是同一个表的2个触发器
ALTER TRIGGER [dbo].[aaa] ON [dbo].[tb1]
FOR UPDATE
AS
begin
UPDATE tb1
SET ModiTime = GETDATE()
From Inserted
WHERE tb1.HR_No = Inserted.HR_No
and tb1.Stat_No = Inserted.Stat_No
UPDATE tb2
Set Password = Inserted.Password
From Inserted
WHERE tb2.HR_No = Inserted.HR_No
and Inserted.Password <> ''
and Inserted.Password is not NULL
-- end
end
ALTER TRIGGER [dbo].[bbb] ON [dbo].[tb1]
FOR INSERT
AS
begin
UPDATE tb1
SET InTime = GETDATE()
From Inserted
WHERE tb1.HR_No = Inserted.HR_No
and tb1.Stat_No = Inserted.Stat_No
IF NOT Exists(Select HR.HR_No From tb1 HR, Inserted Where HR.HR_No = Inserted.HR_No)
begin
UPDATE tb2
Set Password = Inserted.Password
From Inserted
WHERE tb2.HR_No = Inserted.HR_No
end
end
如果HR_No都是索引列,应该很快。功能好像是记录最后更新时间(这个有时间戳吧),同步密码字段到另一个表(这个可以利用视图吧)
tb1如果主键是(HR_No,Stat_No),与tb2的连接就不是唯一的了这一句不知道判断什么
IF NOT Exists(Select HR.HR_No From tb1 HR, Inserted Where HR.HR_No = Inserted.HR_No)
我是这样理解的,因为我也是维护。。
go
create table ccnt(n int)
go
create table ctst(id int, x int)
goinsert ccnt select 0
insert ctst select 1,1
go
select * from ccnt
select * from ctst
gocreate trigger tr on ctst for update
as
update ctst set x=x+1
update ccnt set n=n+1
go
create trigger tr1 on ctst for insert
as
update ctst set x=x-2
update ccnt set n=n+1
go
insert ctst select 2,20select * from ctst
select * from ccnt