通常,SQL Server 会在更新期间获取锁。它还支持锁升级:
锁升级是将许多细粒度锁转换为较少粗粒度锁的过程,减少系统开销的同时增加并发争用的概率。
在事务 ROLLBACK 期间,SQL Server 是否会降级锁,放回细粒度锁?
我正在使用 SQL Server 2014 Express
似乎在发生诸如数据锁定之类的事件时重新启动 SQL Server 并不是(总是)一个好主意。http://www.sqlpassion.at/archive/2016/08/08/restarting-sql-server-always-a-good-idea/
我想具体问一下SQL Server重启会回滚未提交的事务的问题。
我同事跑了 SELECT @@TRANCOUNT了,结果为零。因此,他认为重新启动 SQL Server 不会导致任何类型的回滚。然而,一个从一张桌子移到另一张桌子的位置,在重新开始后又被移回了原处。
是否存在即使SELECT @@TRANCOUNT返回零也会发生回滚的情况?
我对 SQL 中的事务有一些疑问。我执行以下步骤。
如果连接 1 上的提交事务失败(回滚),则连接 2 上的事务应该回滚。是否可以?怎么做?
我再一次疑惑了。
昨晚我们在一些大型查询期间发生了服务器崩溃。早上重新启动后,MySQL 进入恢复模式。我需要关闭 MySQL 服务,它正在等待...我假设未提交事务的后台回滚如日志所示,但它已经在 HOT 服务器上运行了 9 个多小时,而且看不到结束的情况。
当服务重新启动时,可以在后台安全地中断并恢复该进程吗?或者我们必须等待它喘息。
任何意见或想法(甚至有关正在发生的事情的信息)都会非常有帮助。提前谢谢您。
我们正在运行 MySQL 5.5。
这是日志输出:
140930 9:04:30 InnoDB: Starting an apply batch of log records to the database...
InnoDB: Progress in percents: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 …Run Code Online (Sandbox Code Playgroud) 我有多个数据库会话,由于应用程序冻结,其中一个会话一直在阻止其他会话。在多个会话上运行事务。由于其他会话的锁定请求超时,我需要终止头部阻止程序。杀死该会话后,其他用户报告数据丢失。我很确定他们已经提交了他们的交易,但他们似乎仍然被回滚了。他们甚至可以证明它,因为一些文档已经打印出来,但后来丢失了数据。
由于另一个会话的回滚,提交的事务是否有可能被回滚?我不这么认为,但在阅读COMMIT 文档后,我有疑问。它说:
如果@@TRANCOUNT 大于 1,COMMIT TRANSACTION 只会将 @@TRANCOUNT 减 1,并且事务保持活动状态。
阅读TRANCOUNT 文档,它说:
返回在当前连接上发生的 BEGIN TRANSACTION 语句的数量。
那么当前连接是否与会话相同,或者多个会话可以共享同一个连接(也许通过池)?如果他们可以分享,这与交易有什么关系?这些活动事务是否会在稍后甚至在提交之后回滚?
[编辑] 更清楚的是,一些用户没有得到锁定超时,因为他们的数据与头部拦截器没有冲突。他们提交了事务,但在杀死头部阻止程序后,这些事务似乎已回滚。
[更新 2018-03-29]发生新事件后,我有机会在问题发生时进行调查。事务日志得出结论,问题是一个从未提交的嵌套事务。导致问题的应用程序并未冻结,因此用户在关闭应用程序之前从未注意到它。那时他丢失了他的数据,因为事务被回滚了。我接受了可能的最佳答案,那是告诉我不可能回滚已提交事务的答案。我想这真的不可能,只是很难找到真正的问题。
我有一个建立在 SQL Server 上的数据库
应用程序 1 [旧版应用程序]:
用 C# 编写,并在上述数据库上运行事务。
应用程序 2 [正在开发的新应用程序]:
用 Python 编写,并在上述数据库上运行事务。
注意事项:
这些应用程序访问同一组表并执行类似的操作。
随着时间的推移,我们正在尝试从较旧的应用程序过渡到较新的应用程序。
我发现系统中发生了几个死锁和回滚。
问题
我想了解通过一个应用程序运行的事务是否有可能影响来自独立的其他应用程序的事务。
这些场景是由 DBMS 本身在内部处理还是必须在应用程序级别处理?
正如标题所说,在回滚事务时,我是否对整个数据库具有读/写访问权限?
或者仅对事务未写入的表进行读/写访问?什么是锁定行为?
如果我有读访问权限,当我读取事务回滚写入的表时会发生什么(查询失败还是等待)?
抱歉,我曾尝试在线阅读(ROLLBACK TRANSACTION (Transact-SQL)),但似乎没有触及这种深度。
我正在将索引应用于具有存档数据的数据库。我知道这需要很长时间。当我昨晚离开它时,它正在运行 14 小时。今天早上我回到它,企业经理告诉我它已经失去了连接。
在检查服务器上的活动监视器时,我可以看到任务。它的状态是 SUSPENDED,等待类型为 IO_COMPLETION。
有没有办法恢复这个或杀死它并重新开始?
我跑了,sp_who2但它没有被任何其他活动阻止并且状态为 ROLLBACK。如果我然后运行kill 61 with statusonly,SQL 会告诉我;
无法获取状态报告。进程 ID 61 的回滚操作不在进行中。
只是寻找关于我下一步可以做什么/尝试的选项。谢谢。
在应用程序的开发过程中,用户通常想要添加新模块、业务规则等。所以我经常使用 SQL Server 2008 选项从开发数据库创建脚本以生成新表,然后我将在发布之前在生产服务器上执行应用程序的新版本。
所以我想知道有没有办法将整个生成脚本文件放在事务中,如果在将所有内容返回到以前的状态时出现错误,没有添加新表,插入数据等时回滚更改。
如果有原因这不是推荐的方法,请解释。
假设我有一个打开的 SQL Server 会话,并执行以下操作:
begin tran
insert into People (Id) values (1)
select @@TRANCOUNT -- Prints 1
save transaction tt
begin tran
select @@TRANCOUNT -- Prints 2
insert into People (Id) values (2)
Run Code Online (Sandbox Code Playgroud)
好的,现在我做了一个:
rollback tran tt
select @@TRANCOUNT -- Prints 2!
Run Code Online (Sandbox Code Playgroud)
我的问题可能很明显:
为什么部分回滚不会减少内部事务增加的@@TRANCOUNT?
要提交更改,我应该执行两个提交命令。恕我直言,似乎并不自然。
rollback ×10
sql-server ×8
transaction ×5
locking ×2
crash ×1
dbms ×1
innodb ×1
mysql ×1
scripting ×1