事务提交的记录的两个问题

brallow 2008-11-04 08:42:23
1、如何查询这条记录被“提交”的时间?假设这个表中有一列值,有默认值为GetDate(),那么这个时间是SQL执行的时间还是事务提交的时间?我理解的应该是SQL语句执行的时间。
2、如果这个事务没有提交,那么这行记录在其它连接中是否可见?
...全文
154 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 phy 的回复:]
还出现了一个奇怪的现象。 这个表中,除了我上面提到的有一列,默认值为GetDate(),我假设这一列为InsertTime吧,那么还有一列为updat_time,这个时间的值至少应该是在插入这条记录之后才生成或者修改的,而且也肯定是使用GetDate()这样的语句,但在现实中却现出了InsertTime>UpdateT_time的现象。
就是说这条记录实际插入的时间,要晚于它被修改的时间??
[/Quote]

这种情况可能发生在有过回滚操作。
fcuandy 2008-11-04
  • 打赏
  • 举报
回复
1,是语句执行时间。
事务未提交前,将数据写入高速缓冲区,如果数据中有getdate这样的列或值,那么缓部区中就已经在了,提交时将脏页(缓冲区数据)写入碰盘.
至于这点,自己很容易做个测试

--CREATE TABLE ta (id INT,d DATETIME NOT NULL DEFAULT GETDATE())
--SELECT * FROM ta
/*
1 2008-11-04 11:20:59.810
*/
BEGIN TRAN
INSERT ta (id) SELECT 1 --执行时的时间是11:20
WAITFOR TIME '11:22' --提交时间是11.22
COMMIT TRAN

如果想了解的更详细,可以dbcc log查看做了什么。就不用写这样的测试了。


2,如果事务未提交,这行记录是否在其它连接中可见?
这个依具具体的操作类型(如delete,update,insert)和事务隔离级别来确定
brallow 2008-11-04
  • 打赏
  • 举报
回复
不要讨论机器时间的问题,这个问题早就检查过否定了。
生活真美好 2008-11-04
  • 打赏
  • 举报
回复
GetDate()取的是服务器的时间,检查一下两台机器的时间是否一致。
rucypli 2008-11-04
  • 打赏
  • 举报
回复
是一台机器的getdate()吗
brallow 2008-11-04
  • 打赏
  • 举报
回复
还出现了一个奇怪的现象。 这个表中,除了我上面提到的有一列,默认值为GetDate(),我假设这一列为InsertTime吧,那么还有一列为updat_time,这个时间的值至少应该是在插入这条记录之后才生成或者修改的,而且也肯定是使用GetDate()这样的语句,但在现实中却现出了InsertTime>UpdateT_time的现象。
就是说这条记录实际插入的时间,要晚于它被修改的时间??
brallow 2008-11-04
  • 打赏
  • 举报
回复
有没有人能够准确点解释一下?
hyde100 2008-11-04
  • 打赏
  • 举报
回复

1、如何查询这条记录被“提交”的时间?假设这个表中有一列值,有默认值为GetDate(),那么这个时间是SQL执行的时间还是事务提交的时间?我理解的应该是SQL语句执行的时间。

2、事务提交后SQL才真正执行,数据才产生在表中
2、如果这个事务没有提交,那么这行记录在其它连接中是否可见?
不可见,事务会锁定表
幸运的意外 2008-11-04
  • 打赏
  • 举报
回复
时间字段所保存的时间是当前插入时间.如果事务发生回滚,是根据日志文件来回滚的.
如果表没有加上锁,那么时间字段在被更新后就可以被别的进程读取,只是在发生回滚时,之前其他进程读取的就编程脏数据了.

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧