问题标签 [transaction-isolation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3042 浏览

sql-server - T-SQL 事务如何不是线程安全的?

以下(经过清理的)代码有时会产生这些错误:

无法删除表“database.dbo.Table”,因为它不存在或您没有权限。
数据库中已经有一个名为“表”的对象。

代码可以同时运行多次。有谁知道为什么会断?

0 投票
7 回答
2866 浏览

sql - 仅提交在 TRANSACTION 中进行的可能回滚的特定更改

这是对原始问题的重要修改,使其更加简洁并涵盖了现有答案提出的要点......

是否可以在单个事务中对多个表进行多次更改,并且只回滚一些更改?

在下面的 TSQL 中,我不希望“myLogSP”所做的任何更改都被回滚。但如有必要,各种 myBusinessSP 所做的所有更改都应回滚。

顺序很重要,myLogSPs 必须发生在 myBusinessSPs 之间和之后(myLogSPs 接受 myBusinessSPs 所做的更改)

同样重要的是,所有 myBusinessSP 都发生在一个事务中以维护数据库完整性,并在必要时允许其所有更改回滚。

就好像我希望 myLogSP 表现得好像它们不是事务的一部分。它们恰好在一个内部(由于需要在 myBusinessSP 之间调用),这只是一个不便的事实。

编辑:

最终答案是“否”,唯一的选择是重新设计代码。要么使用表变量进行日志记录(因为变量不会回滚),要么将业务逻辑重新设计为不需要事务...

0 投票
4 回答
991 浏览

sql-server-2005 - 我应该如何在 SQL Server 2005 中实现“自动编号”字段?

我知道 IDENTITY 字段,但我有一种感觉,我无法使用一个来解决我的问题。

假设我有多个客户。每个客户都有多个订单。每个客户都需要为他们的订单按顺序编号,具体到他们自己。

示例表结构:

此表的一些示例行将是:

我知道天真的方法是将 MAX ClientOrderID 用于任何客户端并将该值用于 INSERT,但这会受到并发问题的影响。我正在考虑使用事务,但我不太确定可用于此的最广泛的隔离范围。我将使用 LINQ to SQL,但我觉得这无关紧要。

0 投票
1 回答
2626 浏览

sql-server - 如果从一个存储过程中调用另一个设置较低事务隔离级别的存储过程,可以吗?

我有一堆实用程序,它们只是检查数据库中的某些条件并返回一个标志结果。这些过程以 READ UNCOMMITTED 隔离级别运行,相当于 WITH NOLOCK。

我还有更复杂的过程,它们以 SERIALIZABLE 隔离级别运行。他们也碰巧有这些相同的支票。

所以我决定从那些复杂的过程中调用这些检查过程,而不是复制检查代码。

基本上它看起来像这样:

这样做可以吗?临时激活的较低隔离级别会以某种方式破坏较高级别的保护,还是一切都完美安全?

编辑:执行顺利,没有任何错误。

0 投票
4 回答
13901 浏览

sql - NOLOCK 与事务隔离级别

使用“SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”和 NOLOCK 有什么区别?这个比那个好吗?

0 投票
1 回答
831 浏览

sql-server-2005 - oledb 连接上的事务隔离级别

我有一个从 clickview 到 sql2005-server 的 oledb 连接,我希望这个连接使用未提交读取的事务隔离级别。我的第二选择是将其设置在用户身上。我怎样才能做到这一点?

0 投票
1 回答
1557 浏览

sql - 为 Microsoft.Practices.EnterpriseLibrary 设置默认隔离级别

我有一个 .net 3.5 网站,它使用 Microsoft.Practices.EnterpriseLibrary 调用数千个不同的存储过程。

我们遇到了很多超时,经过一些游戏和测试,在存储过程中表连接的末尾使用 (nolock) 效果很好,并减少了超时。

我现在想对所有 sps 执行此操作。我可以将(nolock)添加到所有表名,但是更好的主意是使用 SQL “SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”设置隔离级别

我不想将此添加到所有 sp 的开头(因为有很多),所以正在寻找一种将其添加到连接的方法。

调用sp的代码示例如下

我认为此设置是 web.config 中的配置设置,但无法弄清楚它是什么,或者我是否在正确的轨道上。

非常感谢任何帮助。

干杯阿姆吉德

0 投票
1 回答
2295 浏览

sql-server - 带有 SQL Server 2005 的 Crystal Reports:设置事务隔离级别

当 Crystal Reports 查询 SQL Server 2005 数据库时,是否可以指定事务隔离级别,而无需使用以下任何方法:

  • 将报表的查询封装在一个SET TRANSACTION ISOLATION LEVEL...在查询本身之前执行的存储过程中
  • 在 Crystal Reports 中手写 SQL 查询以执行SET TRANSACTION ISOLATION LEVEL...
0 投票
2 回答
434 浏览

php - 锁定 PHP 以实现关键部分 - MySQL 的意外结果

目标是拥有一个 PHP 脚本,其中包含特定部分的代码,一次只能由一个线程/进程执行。

一些限制:

  • 我的系统上没有信号量
  • 手册中提到在多线程服务器中不能依赖flock(),所以flock() 被淘汰了。(证实了这一点)

所以认为有可能(为什么不呢?)使用 MySQL 进行同步,但我得到了意想不到的结果。

为了测试,我用脚本 test.php 打开了两个浏览器选项卡

表格是:

我转到第一个浏览器选项卡并访问脚本。我等待 5 秒钟,转到另一个选项卡并访问脚本,以便两个脚本并行运行。我希望第一个选项卡等待,第二个选项卡应该在第一个查询后退出。但是,两个选项卡都在 sleep() 行上等待。这意味着第一个查询总是返回 'NOT_RUNNING' 。

一些奇怪的事情:

  • 当我重复上述实验时,我在 FireFox 中运行两个选项卡,然后在第三种不同的浏览器类型中运行,比如 Chrome,然后它就可以工作了!(睡眠时状态设置为 RUNNING ,当状态为 RUNNING 时脚本提前退出)
  • 当我使用两个不同的命令行窗口重复上述实验并从命令行运行脚本时,它可以工作了!
  • 我在等待时检查 phpMyAdmin,状态得到正确更新。

我已经尝试了一切,锁定表、事务、SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED、SET autocommit=1;,但结果始终相同。

有谁知道这里发生了什么?这个问题有什么好的解决方案吗?

测试系统: - Win、MySQL 5.0、php 5.3 - Linux、MySQL 5.0.91-community-log、php 5.2.12

我完全被困在这里,谢谢你看!


更新:

感谢您提交答案 - 我仍然无法解决此问题。这是建议的带有 GET_LOCK() 和 session_write_close() 的代码:我还尝试了行级锁定、事务和不同的隔离级别。或许做不到?

0 投票
1 回答
841 浏览

nhibernate - Nhibernate : generates insert then update statements, in multithreaded environment leads to deadlock issues

I've experienced the following scenario when using NHibernate with SQL Server 2005.

I have a business process which involves the following steps:

  1. Start transaction
  2. Create nhibernate mapped object
  3. Save nhibernate mapped object
  4. Perform other business workflow steps
  5. Update nhibernate mapped object in step 2
  6. Commit transaction

In a single threaded environment this works fine. However when running a multithreaded load test which performs the same use case on separate entities I found that I encountered a number of deadlocks. The transaction isolation level was left on the default setting of read committed.

Upon investigation i've found that the cause of the problem is that nhibernate issues an insert & update statement for the entity created in step 2 & updated in step 5. From further testing I understand that the update statement is locking the whole table & not just the rows being updated, this then leads to deadlocks when another thread tries to access the table for an insert or update.

Q1: Is it possible to get nhibernate to just lock the rows it is updating i.e apply a row lock when issuing an update?

As yet I've not found a way of getting nhibernate to just run a single insert statement as opposed to an insert and then update statement.

Q2: Does anyone know of a configuration option to alter this behaviour?

I've managed to get over the problem of deadlocks occuring on the multithreaded load test by switching on snapshot isolation on my SQL Server database and setting the transaction isolation level to snapshot.

I'd be interested to hear if anyone has experienced any similar issues.