【问题标题】:MS SQL Not recording all transactionsMS SQL 不记录所有事务
【发布时间】:2019-06-18 06:58:40
【问题描述】:

我使用 Sql Server 数据库来记录我的游戏日志。每一个动作都会被记录到一个特定的表中。我正在使用存储过程来记录日志,每天大约 50k 个日志。

最近我注意到它没有记录所有提交的日志。有时我只有 2000 条日志,有时我有 100,000 条。我找不到导致此问题的代码有任何问题。

一秒钟内可以调用多少个存储过程?
掉线这么多电话的原因可能是什么?
我可以做些什么来确保所有的调用都被插入到表中?
使用普通调用而不是存储过程调用会有所帮助吗?

【问题讨论】:

  • 你应该为你的 sp. 添加错误处理。如果您的表中有标识字段,请检查它是否存在差距,如果存在差距,您的交易将被回滚
  • SQL Server 不会掉线。如果记录丢失,则意味着您的存储过程失败。无论叫什么,它都应该记录失败。这个存储过程是怎么调用的?或者可能是查询没有返回您期望的记录数量。至少没有存储过程的源代码,就无法提供帮助。
  • I can't find anything wrong with my code to cause this. 你在任何地方都使用catch{} 吗?你记录异常吗?

标签: sql sql-server database


【解决方案1】:

一秒钟内可以调用多少个存储过程?

无关紧要。您的 DBMS 不会因为不堪重负而“丢失”事务。

掉线这么多电话的原因是什么?

你有什么证据表明一个电话都掉线了?你什么都没提。

我可以做些什么来确保所有的调用都被插入到表中?

查找未提交您的事务的地方。

使用普通调用而不是存储过程调用会有帮助吗?

不,相反。存储过程更有效,并为您提供其他方式不可用的安全功能。

我猜你没有提交更新。您可能没有每次都调用 commit,或者您没有注意到阻止应用更新的错误。

我要检查的第一件事是控制 COMMIT 是隐式还是显式的连接属性。如果您将连接 not 设置为要求应用程序显式提交,则每个 INSERT 都会自动提交。这似乎是您想要的日志表。

您可能要做的是创建一个“日志日志表”,并在每次调用存储过程时插入其中,并在每次完成时再次插入时间和状态。绝对确保对日志表的更新不是某些可能回滚的较大事务的一部分。通过检查@@trancount 进行验证。如果大于 1,则返回错误,并确保正确记录错误。如果您在日志表中包含关键信息,您可以将其与主表进行比较,以查看谁遗漏了什么。我敢打赌它会揭示线索。

在您的应用程序中,您可能会在每次更新服务器、每次响应时写入日志文件,并记录时间和状态。如果该日志与您的日志表不一致,那么您就知道您有一些事情需要调查。

您说对了一件事:如果更新是通过网络到达的,则连接有可能被断开。如果它在提交之前被删除,那将解释丢失的更新,因为插入被回滚。

【讨论】:

  • 如果有一个自动增量列,它会显示回滚的间隙吗?
  • @CaiusJard,如果insert成功,后面的事务回滚,就会有gap。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2023-03-19
  • 2020-12-22
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多