我们能否在Server 2005/2008中的存储过程中为普通SQL语句设置隔离级别?
案例1:(这会很好)
CREATE PROCEDURE MySP
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRAN
SELECT * FROM MyTable
COMMIT TRAN
END
案例2:(这种隔离技术在这里有效吗?)
CREATE PROCEDURE MySP
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCO
我有一堆实用程序过程,它们只是检查数据库中的一些条件并返回一个标志结果。这些过程在读未提交的隔离级别上运行,相当于使用NOLOCK。
我还有更复杂的过程,这些过程都是与SERIALIZABLE隔离级别一起运行的。他们身上也有同样的支票。
因此,我决定从这些复杂的过程中调用这些检查过程,而不是复制检查代码。
基本上看起来是这样的:
CREATE PROCEDURE [dbo].[CheckSomething]
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION
-- Do chec
我运行了以下查询:
SELECT session_id,CASE transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN 'ReadUncommitted'
WHEN 2 THEN 'ReadCommitted'
WHEN 3 THEN 'Repeatable'
WHEN 4 THEN 'Serializable'
WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATI
在存储过程中,我有以下内容:( server 2008 )
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION getStuff
BEGIN TRY
/* some selects, updates, etc, etc. */
....
COMMIT TRANSACTION getStuff
END TRY
BEGIN CATCH
...
END CATCH
因为这是基于事务的,所以我认为其余的数据库连接不会受到SERIALIZABLE的影响。
是否需要隐式设置隔离级别以在
我只是想知道在创建TransactionScope,时使用可序列化作为默认隔离级别的一个好的理由是什么,因为我想不出有什么原因(而且似乎您不能通过web/app.config更改默认的隔离级别,所以您总是必须在代码中设置它)
using(var transaction = TransactionScope())
{
... //creates a Transaction with Serializable Level
}
取而代之的是,我必须像这样写样板代码:
var txOptions = new System.Transactions.TransactionOptions();
如果紧跟在BEGIN之后的是SET TRANSACTION ISOLATION LEVEL ...语句,那么无论我是否使用BEGIN TRANSACTION,给定的事务级别是否会在整个存储过程的作用域中生效?也就是说,如果我有简单的SELECT语句,这些语句根据定义是原子的/事务的,那么它们的默认事务级别是否会设置为给定的级别?
BEGIN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
-- will a transaction level for a atomic transaction created by SQL Server for t
我读过关于快照隔离优势的文章。快照隔离级别防止脏读、不可重复读取和幻影读取。但是在我下面提到的测试中,我可以看到幻影读取的发生。那么,我的问题是快照隔离如何防止幻影读取?
create table ABC(id int, name varchar(100))
insert into abc
values
(1,'a'),
(2,'b'),
(3,'c')
alter database xyz
set allow_snapshot_isolation on
-----session 1
我是一个开发人员,只有公平的数据库知识。我需要了解InnoDB中的事务级锁定机制。
我读到InnoDB使用行级锁定?据我所知,它锁定了事务中的特定行。当正在进行表更新时,select语句会发生什么情况?
例如,假设有事务和select语句都是从两个不同的进程触发的,并且假设Transaction1在select语句发出之前启动。
Transaction1 : Start
Update table_x set x = y where 1=1
Transaction1 : End
选择查询
Select x from table_x
select语句将发生什么情况。它是在Transaction1发
我的数据库包含名为sample_table的表,它由一个名为user_first_name的列组成,该表为空
假设我有两个这样的交易
START TRANSACTION;
INSERT INTO sample_table VALUES("TEJA");
INSERT INTO sample_table VALUES("TEJA");
INSERT INTO sample_table VALUES("TEJA");
INSERT INTO sample_table VALUES("TEJA");
INSERT INTO sample
我们有一个进程需要在事务中运行一组特定的存储过程,如果其中一个失败了,则失败.
简单来说,我们有一些类似的东西:
BEGIN TRY
BEGIN TRANSACTION;
--run some sprocs
EXEC [dbo].[sproc1];
EXEC [dbo].[sproc2];
EXEC [dbo].[sproc3];
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUN
是否可以在写入数据库的同一事务中读取(即选择)列?
我的代码如下所示:
using (IGenericTransaction trans = m_GenericSession.BeginTransaction())
{
//persist a column to table tExample with Id = 1
WriteSubItems();
trans.Commit();
}
public void WriteSubItems()
{
IDbTransaction trans = GetTransaction();
//SELECT colu
如果可序列化隔离级别有效,表X的内容是什么?
由于可序列化,我认为事务B不能执行任何操作。因此,行b不被放置在表X中,并且不执行事务A的删除行b操作。因此,表X只包括行a;然而,我的教授拒绝了这一理论,没有任何解释。
Transaction A Transaction B
1) Begin ....
2) Insert row a Begin
3) .... Insert row b
4) .... Delete row a
5) Delete row b ....
6) Commi
当我看到以下结构时,我一直在查看我们的系统上的一些存储过程:
(表示实际SP的伪代码,服务器正在使用默认隔离级别):
CREATE PROCEDURE ...
AS
BEGIN
IF NOT EXISTS(SELECT ...)
BEGIN
RETURN;
END
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
DML...
DML...
DML...
COMMIT
END
我没有看到事务隔离级别在事务边界内被声明,我想知道它的效果是什么?
事务提交后是否恢复了
我试图避免将相同Identifier字段值的多行插入到数据库中。以下是代码:
public async Task InsertTransaction(Transaction transaction)
{
await using var dbTransaction = await _dbContext.Database.BeginTransactionAsync(IsolationLevel.RepeatableRead);
var existing = await _dbContext.Set<Transacti
未提交的SET事务隔离级别在“开始”的不同部分。下面两个查询的行为是否相同?
视图viewOne和viewTwo会继承脏读吗?或者视图需要一个显式的"NOLOCK“
查询1
set transaction isolation level read uncommitted
begin
select col1 from viewOne
select * from viewTwo
select * from table1
end
查询2
begin
set transaction isolation level read uncommitted
我可以在postgresql中的存储过程中设置事务级别吗?获取以下调用sp1的错误:
错误:必须在查询之前调用SET事务隔离级别
CREATE OR REPLACE PROCEDURE sp1()
LANGUAGE 'plpgsql'
AS $BODY$
begin
update table1 set a=1;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
update table1 set a=2;
END;
$BODY$;
我在SQL数据库上运行以下SQL语句:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
BEGIN TRANSACTION;
UPDATE Project SET Name = 'NewLim2' WHERE Projectid = 403179
WAITFOR DELAY '00:00:10'
COMMIT TRANSACTION
然后,在10秒的延迟期间,我使用另一个连接,它执行以下选择:
SELECT * FROM Project WHERE Projectid = 403179
但是它的结
如果有人在非常快的时间内运行存储过程(每秒执行几千次),那么在执行和执行update时,变量@ execution是否会改变?
CREATE PROCEDURE [dbo].[PayoutInvestment]
@userid AS VARCHAR(50)
,@idi AS INT
AS
BEGIN
BEGIN TRANSACTION;
DECLARE @amount AS DECIMAL(18, 2) = (
SELECT amount
FROM investments
WHERE u
我读过这个:
但我担心在嵌套set模型中插入新节点时的锁定问题。我想在我的树形目录中插入一个新节点,但我想确保插入的新节点没有损坏。mysql中使用的引擎是InnoDb。正如另一个问题所说的:
BEGIN; -- or whatever API your framework has for starting a transaction
SELECT @myLeft := lft FROM myTable WHERE ID = $id FOR UPDATE;
UPDATE myTable SET rgt = rgt + 2 WHERE rgt > @myLeft;
试图了解SQL Server内存优化表(内存中的oltp)上事务隔离级别的工作方式。
如果我执行以下查询:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks
显示一条错误消息:
仅对于自动提交事务,才支持使用读提交隔离级别访问内存优化表。它不支持显式或隐式事务。使用表提示(如WITH (快照))为内存优化表提供受支持的隔离级别。
现在,如果我通过添加表提示来修改查询,它可以工作:
SET TRANSACTION ISOLATION LEVEL READ CO