超奇怪的问题,高手请进!!!!!高分求助!!! 在触发器中操作timestemp类型的列 ? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我记得触发器中的跟新不是产生2张表的吗?一张insert,一张delete,如果从delete中取值的话会出错的。 To lyz1137 我在删除A的删除触发器中写更新B的操作我确实是从deleted 表读取。 select @houseid=houseid from deleted update house set housecardno='无' where id=@houseid请问deleted 和 inserted的差别 deleted应该是当前后台的版本inserted应该是从前台传入的版本我要删除A的记录,在删除前取得A表中保存的B的ID,然后使用这个ID去更新B。这里应该取Inserted的值? deleted会把原先的都删除再执行 inserted插入才算跟新完成,既然删除了表中无信息了查询就可能出错。这是我的理解 看完这段对你有帮助1.4. 事务处理的隔离级别使用SET TRANSACTION ISOLATION LEVEL来控制由连接发出的所有语句的默认事务锁定行为从低到高依次是:READ UNCOMMITTED执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。举例设table1(A,B,C)A B Ca1 b1 c1a2 b2 c2a3 b3 c3新建两个连接在第一个连接中执行以下语句select * from table1begin tranupdate table1 set c='c'select * from table1waitfor delay '00:00:10' --等待10秒rollback transelect * from table1在第二个连接中执行以下语句SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDprint '脏读'select * from table1if @@rowcount>0beginwaitfor delay '00:00:10'print '不重复读'select * from table1en第二个连接的结果脏读A B Ca1 b1 ca2 b2 ca3 b3 c'不重复读'A B Ca1 b1 c1a2 b2 c2a3 b3 c3READ COMMITTED指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。在第一个连接中执行以下语句SET TRANSACTION ISOLATION LEVEL READ COMMITTEDbegin tranprint '初始'select * from table1waitfor delay '00:00:10' --等待10秒print '不重复读'select * from table1rollback tran在第二个连接中执行以下语句SET TRANSACTION ISOLATION LEVEL READ COMMITTEDupdate table1 set c='c'第一个连接的结果初始A B Ca1 b1 c1a2 b2 c2a3 b3 c3不重复读A B Ca1 b1 ca2 b2 ca3 b3 cREPEATABLE READ锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。在第一个连接中执行以下语句SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin tranprint '初始'select * from table1waitfor delay '00:00:10' --等待10秒print '幻像读'select * from table1rollback tran在第二个连接中执行以下语句SET TRANSACTION ISOLATION LEVEL REPEATABLE READinsert table1 select 'a4','b4','c4'第一个连接的结果初始A B Ca1 b1 c1a2 b2 c2a3 b3 c3幻像读A B Ca1 b1 c1a2 b2 c2a3 b3 c3a4 b4 c4SERIALIZABLE在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。在第一个连接中执行以下语句SET TRANSACTION ISOLATION LEVEL SERIALIZABLEbegin tranprint '初始'select * from table1waitfor delay '00:00:10' --等待10秒print '没有变化'select * from table1rollback tran在第二个连接中执行以下语句SET TRANSACTION ISOLATION LEVEL SERIALIZABLEinsert table1 select 'a4','b4','c4'第一个连接的结果初始A B Ca1 b1 c1a2 b2 c2a3 b3 c3没有变化A B Ca1 b1 c1a2 b2 c2a3 b3 c3 我改成从inserted表取B表的ID,然后使用这个ID去更新B表没有抛出异常了但原因是在于,A表触发器没有更新到B的字段值我以前有问题,但是至少A对B的更新是成功的!我的QQ 829098可以加我吗 谢谢happyflystone 我试下。 TO happyflystone 1。删除A,在A的删除触发器中,取出A的记录中的外键字段BID,然后使用BID更新B表2。前台重新读取B表3。前台更改B表并提交,出错4。原因:我的B表更新,如果传入的timestamp字段的值跟数据库中此字段的值(后台会自动维护timesptamp,每当你更新行时,该行的timestamp就会被后台更新),因为传入的timestamp跟后台的timestamp不一样。5。为什么传入的timestamp和后台的timestamp不一样?我明明在第3步重新读了B,难道此时读的不是反映最新的?或者A对B的操作这个连接还占用着? 请教:列组合问题! 请问各位大侠帮帮看看"从字符串转换为 smalldatetime 数据类型时发生语法错误。看看"" 【急,如何修改sql2000字符集】 SQL里面如何返回行信息 |M| 求SQL语句 多表进行合并 数据库查询问题 数据传输方案? 熟悉SQL SERVER 的朋友请进来看一下。有一些问题请教急急!! 有兴趣一起学oracle数据库者,请写下联系方法。QQ:41534793 大虾指教 急!~求救各位大侠,我上传到远程虚拟机的ASP文件为什么连接不了MSSQL2000 case...end语法?
我在删除A的删除触发器中写更新B的操作
我确实是从deleted 表读取。
select @houseid=houseid from deleted
update house set housecardno='无' where id=@houseid请问deleted 和 inserted的差别
inserted应该是从前台传入的版本我要删除A的记录,在删除前取得A表中保存的B的ID,然后使用这个ID去更新B。
这里应该取Inserted的值?
使用SET TRANSACTION ISOLATION LEVEL来控制由连接发出的所有语句的默认事务锁定行为
从低到高依次是:
READ UNCOMMITTED
执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;
在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的
所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。
举例
设table1(A,B,C)
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
新建两个连接
在第一个连接中执行以下语句
select * from table1
begin tran
update table1 set c='c'
select * from table1
waitfor delay '00:00:10' --等待10秒
rollback tran
select * from table1
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
print '脏读'
select * from table1
if @@rowcount>0
begin
waitfor delay '00:00:10'
print '不重复读'
select * from table1
en
第二个连接的结果
脏读
A B C
a1 b1 c
a2 b2 c
a3 b3 c
'不重复读'
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
READ COMMITTED
指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。
该选项是 SQL Server 的默认值。
在第一个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '不重复读'
select * from table1
rollback tran
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL READ COMMITTEDupdate table1 set c='c'
第一个连接的结果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
不重复读
A B C
a1 b1 c
a2 b2 c
a3 b3 c
REPEATABLE READ锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,
且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。
在第一个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '幻像读'
select * from table1
rollback tran
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
insert table1 select 'a4','b4','c4'
第一个连接的结果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
幻像读
A B Ca1 b1 c1
a2 b2 c2
a3 b3 c3
a4 b4 c4
SERIALIZABLE
在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
在第一个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin tran
print '初始'
select * from table1
waitfor delay '00:00:10' --等待10秒
print '没有变化'
select * from table1
rollback tran
在第二个连接中执行以下语句
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
insert table1 select 'a4','b4','c4'
第一个连接的结果
初始
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
没有变化
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3
没有抛出异常了
但原因是在于,A表触发器没有更新到B的字段值
我以前有问题,但是至少A对B的更新是成功的!
我的QQ 829098
可以加我吗
我试下。
1。删除A,在A的删除触发器中,取出A的记录中的外键字段BID,然后使用BID更新B表
2。前台重新读取B表
3。前台更改B表并提交,出错
4。原因:我的B表更新,如果传入的timestamp字段的值跟数据库中此字段的值(后台会自动维护timesptamp,每当你更新行时,该行的timestamp就会被后台更新),因为传入的timestamp跟后台的timestamp不一样。5。为什么传入的timestamp和后台的timestamp不一样?我明明在第3步重新读了B,难道此时读的不是反映最新的?或者A对B的操作这个连接还占用着?