我们正在评估EF4,我的DBA说我们必须在所有SELECT语句中使用NOLOCK提示.所以我正在研究如何在使用EF4时实现这一点.
我已经阅读了关于如何在EF4中实现这一点的不同想法,但所有这些似乎都是一种解决方案而不是微软或EF4批准的.在使用LINQ-to-SQL/LINQ-to-Entities和EF4时,希望他们的SELECT语句包含NOLOCK提示的人的"官方Microsoft"响应是什么?
顺便说一下,我发现的绝对最好的信息就在这里,我鼓励每个对这个主题感兴趣的人阅读这个主题.
谢谢.
我试图找出特定会话(不是我自己)在oracle服务器上的隔离级别.是否有av $ ..查看这个?
我正在阅读一本关于innodb交易的手册,但仍然有很多不清楚的东西给我.例如,我不太了解以下行为:
-- client 1 -- client 2
mysql> create table simple (col int)
engine=innodb;
mysql> insert into simple values(1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into simple values(2);
Query OK, 1 row affected (0.00 sec)
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
mysql> begin;
Query OK, 0 rows affected (0.01 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update simple set col=10 where col=1;
Query OK, 1 row affected …Run Code Online (Sandbox Code Playgroud) 我正在执行几个长时间运行的SQL查询作为报告模块的一部分.这些查询是在运行时动态构造的.根据用户的输入,它们可以是单个或多个语句,具有一个或多个参数并在一个或多个数据库表上运行 - 换句话说,它们的形式不容易预料到.
目前,我只是在普通的情况下执行这些陈述SqlConnection,即
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
// command 1
// command 2
// ...
// command N
}
Run Code Online (Sandbox Code Playgroud)
因为这些查询(实际上是查询批处理)可能需要一段时间才能执行,所以我担心会阻塞其他用户的读/写表.如果这些报告的数据在批处理执行期间发生变化,则不会出现问题.报表查询永远不应优先于这些表上的其他操作,也不应锁定它们.
对于涉及修改数据的大多数长时间运行/多语句操作,我会使用事务.这里的区别在于这些报告查询不会修改任何数据.我是否可以正确地将这些报告查询包装起来SqlTransaction以控制它们的隔离级别?
即:
using (SqlConnection cn = new SqlConnection(ConnectionString)) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction(IsolationLevel.ReadUncommitted)) {
// command 1
// command 2
// ...
// command N
tr.Commit();
}
}
Run Code Online (Sandbox Code Playgroud)
这会实现我想要的结果吗?提交事务是否正确,即使没有修改数据?还有另一种方法吗?
我正在尝试在我的Java应用程序中执行一个巨大的事务,并为user_account_entry具有对user表的外键引用的表执行单个插入条目(数量以千为单位)。
当事务运行时,我无法更新属于获取事务的任何用户实体LockAcquisitionException
我正在使用 MySQL InnoDB 并使用DEFAULT事务隔离级别(该级别转换REPEATABLE-READ为 InnoDB 级别),任何人都可以阐明 mysql 事务期间的外键锁定
我是构建基于ADO.NET的网站的团队的一员.我们有时会有几个开发人员和一个自动化测试工具同时处理数据库的开发副本.
我们使用快照隔离级别,据我所知,它使用乐观并发:而不是锁定,如果您尝试提交事务(如果受影响的行已被另一方更改),则希望获得最佳并抛出异常交易.
要使用快照隔离级别,我们使用:
ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;
Run Code Online (Sandbox Code Playgroud)
在C#中:
Transaction = SqlConnection.BeginTransaction(IsolationLevel.Snapshot);
Run Code Online (Sandbox Code Playgroud)
请注意,IsolationLevel Snapshot与ReadCommitted Snapshot不同,我们也尝试过,但目前还没有使用.
当其中一个开发人员进入调试模式并暂停.NET应用程序时,他们将在调试时与活动事务保持连接.现在,我希望这不是一个问题 - 毕竟,所有事务都使用快照隔离级别,因此当一个事务暂停时,其他事务应该能够正常进行,因为暂停的事务没有持有任何锁.当然,当暂停的事务完成时,它可能会检测到冲突; 但只要其他开发人员和自动化测试可以不受阻碍地进行,这是可以接受的.
但是,实际上,当一个人在调试时暂停事务时,尽管使用了快照隔离级别,但所有其他尝试访问相同行的数据库用户都会被阻止.
有谁知道为什么会这样,和/或我如何才能实现真正的乐观(非阻塞)并发?
决议(对我来说不幸):Remus Rusanu指出作家总是阻止其他作家; 这是由MSDN支持的- 它并没有完全说出来,但只是提到避免读写器锁.简而言之,我想要的行为并没有在SQL Server中实现.
我有一个关于@Transactional注释如何单独管理代码和事务执行的问题.给定一个正确设置的Spring应用程序和以下代码:
@Transactional
public void withdraw(int amount) {
if(isEnoughFunds(amount)) {
decreaseFunds(amount);
}
}
Run Code Online (Sandbox Code Playgroud)
是否可能发生以下情况:
如果这是可能的,你会如何防止这种情况?
我在 MSSQL 2005、2008、2012 中使用 hibernate 3.6。
我想设置会话创建的事务的隔离级别,但是我找不到有关 in 的任何信息。
这是我的代码
Session sess = factory.openSession();
Transaction tx = null;
try {
tx = sess.beginTransaction();
// do some work
...
tx.commit();
}
catch (RuntimeException e) {
if (tx != null) tx.rollback();
throw e; // or display error message
}
finally {
sess.close();
}
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情
sess.beginTransaction(1|2|4|8);
Run Code Online (Sandbox Code Playgroud)
那可能吗?
谢谢你。
如果任何其他会话使用例如自动提交或 READ COMMITED 隔离级别,这对 SERIALIZABLE 事务是否重要?
换句话说,从多个进程/线程(或其他需要注意的地方)访问数据库时,混合隔离级别(和自动提交)是否有任何危险?
请注意,我知道“普通”问题,例如要求重试的 SERIALIZABLE 事务等。我要求在混合不同隔离级别时可能发生的任何不明显的事情。
编辑:
从http://www.postgresql.org/docs/9.4/static/transaction-iso.html:
一致使用可序列化事务可以简化开发。保证任何一组并发可序列化事务将具有与一次运行一个相同的效果意味着如果您能证明单个事务,如所写的那样,在单独运行时会做正确的事情,您可以有相信它会在任何可序列化事务的组合中做正确的事情,即使没有关于其他事务可能会做什么的任何信息。
这可能表明混合隔离级别不是一个好主意。另一方面,它只是说一致使用 SERIALIZABLE 级别是好的,而不是混合隔离级别是坏的。
我读过马丁福勒的书章节 Optimistic Offline Lock
作者描述了以下示例(如果我理解正确的话):
有 2 个实体:Order和Client. 涉及2个交易(业务):
第一个交易计算订单的税额。税额取决于订单点和客户地址
第二笔交易更新客户端地址
这里的问题是,如果在计算税额时client更改地址order,结果可能会不一致。作者提供了两种基于乐观离线锁定的解决方案。其中之一是检查order和client在交易开始时的版本,并检查order和client版本在事务结束。但是这里作者警告我们必须使用REPEATABLE READ隔离级别或更高级别才能第二次读取版本。这是我的问题的一个原因。据我所知,如果我第二次读取任何行,我将得到相同的结果,因为在使用此隔离级别时,DB 会锁定我们之前读取的所有行。
请解释一下作者的想法。
java hibernate transaction-isolation optimistic-locking isolation-level
isolation-level ×10
transactions ×6
sql-server ×4
java ×3
ado.net ×2
hibernate ×2
innodb ×2
mysql ×2
c# ×1
linq ×1
nolock ×1
oracle ×1
oracle10g ×1
postgresql ×1
spring ×1
sql ×1