精华内容
下载资源
问答
  • SQL 导航专用事务1. 事务的特性和强制事务机制2. 事务定义语句3. 并发问题锁1. 锁的分类2. 锁定提示3. 死锁游标1. 游标概念2. 游标类型3. 游标函数 事务 一个事务( Transaction )是由一系列的数据库查询操作和...

    SQL

    事务

    一个事务( Transaction )是由一系列的数据库查询操作和更新操作构成的,把这一系列操作作为单个逻辑工作单元执行,并且是不可分的。

    1. 事务的特性和强制事务机制

    1)事务的特性

    原子性( A ) :一个事务中的所有操作是一个逻辑上不可分割的单位。
    一致性( C ) :事务在完成时,必须使所有的数据都保持一致状态。
    隔离性( I ) :一个事务的执行不能被另一个事务干扰。
    持久性( D ):指一个事务一旦提交,则它对数据库中数据的改变就应该是永久的。

    2)强制事务机制

    事务管理: 强制保持事务的原子性和一致性。事务启动之后,就必须成功完成,否则数据库引擎实例将撤消该事务启动之后对数据所做的所有修改。
    锁机制:锁定设备,强制保持事务的隔离性。
    事务日志:记录设备,保证事务的持久性。即使服务器硬件、操作系统或数据库引擎实例自身出现故障,该实例也可以在重新启动时使用事务日志,将所有未完成的事务自动地回滚到系统出现故障的点。

    2. 事务定义语句

    (1)BEGIN TRANSACTION 语句
    BEGIN TRANSACTION 语句定义一个事务的开始

    (2)COMMIT TRANSACTION 语句
    COMMIT TRANSACTION 是提交一个事务语句

    (3)ROLLBACK TRANSACTION 语句
    ROLLBACK TRANSACTION 是回滚事务语句

    • 若回滚到事务的起点,也可使用 ROLLBACK WORK

    使用事务处理删除学号为 “ 125204999 ” 学生信息。

    代码如下:

    USE STUMS
    GO
    DECLARE @tran_name varchar(32)
    SELECT @tran_name = 'Transaction_delete'
    BEGIN TRAN @tran_name  /*开始事务*/
    DELETE 学生基本信息 WHERE 学号 = '125204999'
    DELETE 选课 WHERE 学号 = '125204999'
    COMMIT TRAN @tran_name /*提交事务*/
    GO
    

    3. 并发问题

    在没有上锁的前提下,多个用户同时访问一个数据库,此时他们的事务同时使用相同的数据时可能会发生问题。这些问题包括以下几种情况:

    1)丢失更新

    当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。
    每个事务都不知道其他事务的存在,最后的更新将重写由其他事务所做的更新,这将导致数据更新丢失。

    例如,有两个用户同时访问 STUMS 数据库的 “ 学生基本信息 ” 表,并读入同一数据进行修改,然后保存更改结果。这样,后保存其更改结果的用户就覆盖了第一个用户所做的更新,破坏了第一个用户提交的结果,导致第一个用户的更新被丢失。如果在第一个用户完成之后第二个用户才能进行更改,则可以避免该问题。

    2)脏读

    脏读是指事务1 修改某数据后,事务2 读取了这一数据,事务1 又由于某种原因撤销其修改,将修改过的数据恢复原值。这样,事务2 读到的数据就与数据库中的数据不一致了,我们称事务2 为 “ 脏读 ” ,读取的数据为 “ 脏 ” 数据。

    例如,一个用户正在修改 STUMS 数据库的教师表中 “ 职称 ” 列的数据,在更改过程中,另一用户读取了教师表的数据。此后,第一个用户发现职称列的数据修改错了,于是删除了所做的修改,将其恢复到原数据并保存。这样,事务2读到的数据包含不再存在的修改内容,并且这些修改内容应认为从未存在过,即“脏读”。如果在第一个用户确定最终更改前任何人都不能读取更改的数据,则可以避免该问题。

    3)不可重复读

    不可重复读是指事务1 读取数据后,事务2 执行了更新操作,使事务1 无法再现第一次读取的结果。针对插入、修改和删除的更新操作,不可重复读有下列三种情况:
    ① 事务1 按一定条件从数据库中读取了某些数据记录之后,事务2 插入了一些记录,当事务1 再次按相同条件读取数据时,发现多了一些数据记录。
    ② 事务1 读取了某一数据记录之后,事务2 对其做了修改,当事务1 再次读取这一数据时,得到与前一次不同的值。
    ③ 事务1 按一定条件从数据库中读取了某些数据记录之后,事务2 删除了其中部分记录,当事务1 再次按相同条件读取数据时,发现某些数据记录不见了。

    例如,一个用户两次读取 STUMS 数据库的选课表中记录信息,但在两次读取之间,另一用户正在进行选修课成绩的录入操作,重写了该文档。当第一个用户再次读取选课表中的数据时,其数据信息已更改,使第一次读取不可重复。如果只有在录入操作的用户全部完成录入后,才可以让其他用户访问选课表数据,则可以避免该问题。

    4)幻象读

    幻象读属不可重复读的特例。当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻象读问题。
    事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其他事务删除。同样,由于其他事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。

    例如,学生处正通过学生信息管理系统统计应届毕业生数,而此时教务处却因毕业班的某学生考试作弊将其开除正整理数据库,将该考生的信息从数据库中删除。这样,就发生了幻象读,导致学生处的统计数据不正确。如果只有在数据删除工作完成后,才让学生处访问 STUMS 数据库,则可以避免该问题。

    1. 锁的分类

    1)共享锁

    共享(S)锁允许并发事务读取( SELECT )一个资源。

    2)排他锁

    排它锁(X)又称互斥锁,可以防止并发事务对资源进行访问。当需要对表进行 INSERT、UPDATE 或 DELETE操作时,应该使用排它锁。

    3)更新锁

    更新(U)锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享锁,然后修改行,此操作要求锁转换为排他锁。

    4)意向锁

    意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享锁或排他锁。 意向锁包括意向共享(IS)、意向排他(IX)以及与意向排他共享(SIX)。

    5)架构锁

    用于保护数据库的模式,又称模式锁。

    6)大容量更新锁

    当将数据大容量复制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 设置了 table lock on bulk 表选项时,将使用大容量更新(BU)锁。

    7) 键范围锁

    在使用可序列化事务隔离级别时,对于 T-SQL 语句读取的记录集,键范围锁可以隐式保护该记录集中包含的行范围。键范围锁可防止幻读。通过保护行之间键的范围,它还防止对事务访问的记录集进行幻像插入或删除。

    2. 锁定提示

    可以在 SELECT、INSERT、UPDATE 和 DELETE 语句中为单个表引用指定锁定提示。在这里插入图片描述

    为 “ 学生基本信息 ” 表加一个共享锁,并且保持到事务结束时再释放。

    代码如下:

    USE STUMS
    GO
    SELECT * FROM 学生基本信息 (TABLOCK HOLDLOCK)
    GO
    

    修改 “ 选课 ” 表学分列数据,为 “ 选课 ” 表加一个更新锁,并且保持到事务结束时再释放。

    代码如下:

    USE STUMS
    GO
    UPDATE 选课 WITH(UPDLOCK HOLDLOCK)
    SET 学分 = 3 WHERE 成绩 >= 60
    GO
    

    3. 死锁

    在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会造成这些任务永久阻塞,从而出现死锁。

    1)死锁检测

    • 死锁检测是由锁监视器线程执行的,该线程定期搜索数据库引擎实例的所有任务。

    锁监视器搜索进程几点处理方法 :

    默认时间间隔为 5 秒。
    如果锁监视器线程查找死锁,根据死锁的频率,死锁检测时间间隔将从 5 秒开始减小,最小为 100 毫秒。
    如果锁监视器线程停止查找死锁,数据库引擎将两个搜索间的时间间隔增加到 5 秒。
    如果刚刚检测到死锁,则假定必须等待锁的下一个线程正进入死锁循环。检测到死锁后,第一对锁等待将立即触发死锁搜索,而不是等待下一个死锁检测时间间隔。

    2) 死锁优先级

    使用 SET DEADLOCK_PRIORITY 语句设置死锁优先级。

    代码如下:

    /*使用变量将死锁优先级设置为 LOW */
    DECLARE @deadlock_var NCHAR(3)
    SET @deadlock_var = N'LOW'
    SET DEADLOCK_PRIORITY @deadlock_var
    GO
    /*将死锁优先级设置为 NORMAL*/
    SET DEADLOCK_PRIORITY NORMAL;
    GO
    

    将锁超时期限设置为 1,800 毫秒。

    代码如下:

    SET LOCK_TIMEOUT 1800
    GO
    

    游标

    1. 游标概念

    游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标是一种数据访问机制,它允许用户访问单独的数据行,而并非对整个行集合进行操作。游标包括以下两个部分。
    游标结果集( Cursor Result Set ):由定义该游标的 SELECT 语句返回的行的集合(可以是零行、一行或多行)。
    游标位置( Cursor Position ):指向游标结果集中某一行的当前指针。

    2. 游标类型

    静态游标在滚动期间很少或根本检测不到变化,但消耗的资源相对很少。
    动态游标在滚动期间能检测到所有变化,但消耗的资源却较多。
    由键集驱动的游标介于静态和动态之间,能检测到大部分变化,但比动态游标消耗更少的资源。
    只进游标和滚动都作为能应用到静态游标、由键集驱动的游标和动态游标的选项。

    3. 游标函数

    • @@CURSOR_ROWS

    可调用 @@CURSOR_ROWS 以确定当其被调用时检索了游标符合条件的行数。其语法格式为:
    @@CURSOR_ROWS
    返回类型为 integer
    返回值有以下几种:
    -m:游标被异步填充。返回值 ( -m ) 是键集中当前的行数。
    -1:游标为动态游标。因为动态游标可反映所有更改,所以游标符合条件的行数不断变化。因此,永远不能确定已检索到所有符合条件的行。
    0:没有已打开的游标,对于上一个打开的游标没有符合条件的行,或上一个打开的游标已被关闭或被释放。
    n:游标已完全填充。返回值 (n) 是游标中的总行数。

    声明一个 xs_Cursor 游标,并且使用 SELECT 显示 @@CURSOR_ROWS 的值。

    USE STUMS
    GO
    SELECT @@CURSOR_ROWS
    DECLARE xs_Cursor CURSOR FOR
    SELECT 姓名, @@CURSOR_ROWS
    FROM 学生基本信息
    OPEN xs_Cursor
    FETCH NEXT FROM xs_Cursor
    SELECT @@CURSOR_ROWS
    CLOSE xs_Cursor
    DEALLOCATE xs_Cursor
    GO
    
    • @@FETCH_STATUS

    通过检测 @@Fetch_Status 的值,可以获得 Fetch 语句的状态信息,该状态信息用于判断该 Fetch 语句返回数据的有效性。其语法格式为:
    @@FETCH_STATUS
    返回类型为 integer。当执行一条 Fetch 语句之后, @@Fetch_Status 可能出现以下三种值:
    0:Fetch 语句成功。
    -1:Fetch 语句失败或行不在结果集中。
    -2:提取的行不存在。

    说明:由于 @@FETCH_STATUS 对于在一个连接上的所有游标都是全局性的,所以要谨慎使用 @@FETCH_STATUS。在执行一条 FETCH 语句后,必须在对另一游标执行另一 FETCH 语句前测试 @@FETCH_STATUS。在此连接上出现任何提取操作之前,@@FETCH_STATUS 的值没有定义。

    声明一个 xs_Cursor 游标,并且使用 @@FETCH_STATUS 控制一个 WHILE 循环中的游标活动。

    USE STUMS
    GO
    DECLARE xs_Cursor CURSOR FOR	-- 声明游标
    SELECT 学号, 姓名, 出生日期
    FROM 学生基本信息
    WHERE 性别 = '女'
    OPEN xs_Cursor 		-- 打开游标
    FETCH NEXT FROM xs_Cursor	-- 提取上一个提取行的后面的一行,如果Fetch Next为对游标的第一次提取操作,
    						    --则返回结果集中的第一行。NEXT 为默认的游标提取选项。
    WHILE @@FETCH_STATUS = 0	-- Fetch 语句成功
    BEGIN
    FETCH NEXT FROM xs_Cursor
    END
    CLOSE xs_Cursor		-- 关闭游标
    DEALLOCATE xs_Cursor	-- 释放游标
    GO
    
    展开全文
  • 文章目录 第七十四章 SQL命令 SET TRANSACTION大纲参数描述%COMMITMODE隔离级别READ UNCOMMITTED还是READ VERIFIED?READ COMMITTED 异常有效隔离级别示例 第七十四章 SQL命令 SET TRANSACTION 设置事务的参数。 ...

    第七十四章 SQL命令 SET TRANSACTION

    设置事务的参数。

    大纲

    SET TRANSACTION [%COMMITMODE commitmode]
    
    SET TRANSACTION [transactionmodes]
    

    参数

    • %COMMITMODE commitmode - 可选-指定向数据库提交事务的方式。
      取值包括EXPLICITIMPLICITNONE
      默认为IMPLICIT
    • transactionmodes - 可选—指定事务的隔离模式和访问模式。
      可以将隔离模式、访问模式或这两种模式的值指定为逗号分隔的列表。隔离模式的有效值为ISOLATION LEVEL READ COMMITTED, ISOLATION LEVEL READ UNCOMMITTED, and ISOLATION LEVEL READ VERIFIED
      默认为“ISOLATION LEVEL READ UNCOMMITTED”
      访问模式的有效值为“READ ONLY”和“READ WRITE”
      注意,只有隔离级别READ COMMITTED与读写模式READ WRITE兼容。

    描述

    SET TRANSACTION语句为当前进程设置控制SQL事务的参数。
    这些参数在下一个事务开始时生效,并在当前进程持续期间或直到显式重置为止。
    它们不会在事务结束时自动重置为默认值。

    单个SET TRANSACTION语句可用于设置提交模式参数或事务模式参数,但不能同时设置两者。

    可以使用START TRANSACTION命令设置相同的参数,该命令既可以设置参数,也可以开始一个新事务。
    也可以使用方法调用设置参数。

    SET TRANSACTION不会开始一个事务,因此不会增加$TLEVEL事务级别计数器。

    SET TRANSACTION可以在动态SQL(包括SQL Shell)和嵌入式SQL中使用。

    %COMMITMODE

    %COMMITMODE关键字允许您指定是否执行自动事务承诺。
    可供选择的选项有:

    • IMPLICIT隐式:自动事务承诺是开启的(默认)。
      当程序发出数据库修改操作(INSERTUPDATEDELETE)时,SQL自动启动一个事务。
      事务将继续进行,直到操作成功完成并SQL自动提交更改,或者操作无法在所有行上成功完成并SQL自动回滚整个操作。
      每个数据库操作(INSERTUPDATEDELETE)构成一个单独的事务。
      成功完成数据库操作将自动清除回滚日志、释放锁并减少$TLEVEL
      不需要COMMIT语句。
      这是默认设置。
    • EXPLICIT:关闭自动事务承诺。
      当程序发出第一个数据库修改操作(INSERTUPDATEDELETE)时,SQL自动启动一个事务。
      该交易将继续进行,直到明确达成协议。
      成功完成后,发出COMMIT语句。
      如果数据库修改操作失败,则发出ROLLBACK语句将数据库恢复到事务开始之前的位置。
      EXPLICIT模式下,每个事务的数据库操作数是用户定义的。
    • NONE:没有自动事务处理。
      除非由START transaction语句显式调用,否则不会初始化事务。
      必须通过发出COMMITROLLBACK语句显式地结束事务。
      因此,事务中是否包含数据库操作以及事务中数据库操作的数量都是用户定义的。

    TRUNCATE TABLE不会在自动启动的事务中发生。
    如果需要对TRUNCATE TABLE进行日志记录和回滚,则必须显式指定START TRANSACTION,并以显式COMMITrollback结束。

    可以使用GetOption(“AutoCommit”)方法确定当前进程的%COMMITMODE设置,如下面的ObjectScript示例所示:

    ClassMethod SetTransaction()
    {
    	s stat = $SYSTEM.SQL.SetOption("AutoCommit",$RANDOM(3),.oldval)
    	if stat '= 1 {
    		w "SetOption failed:" 
    		d $System.Status.DisplayError(stat) 
    		q
    	}
    	s x = $SYSTEM.SQL.GetOption("AutoCommit")
    	if x = 1 {
    		w "%COMMITMODE IMPLICIT (default behavior):",!,
    		"每个数据库操作都是一个独立的事务",!,
    		"自动提交或回滚" 
    	} elseif x = 0 {
    		w "%COMMITMODE NONE:",!,
    		"没有自动事务支持",!,
    		"必须使用START TRANSACTION来启动事务",!,
    		"和COMMIT或ROLLBACK来结束一个" 
    	} else { 
    		w "%COMMITMODE EXPLICIT:",!,
    		"第一次数据库操作自动进行",!,
    		"启动一个事务;结束事务",!,
    		"需要显式的COMMIT或ROLLBACK" }
    }
    

    %COMMITMODE可以在ObjectScript中使用SetOption()方法设置,如下set status=$SYSTEM.SQL.Util.SetOption("AutoCommit",intval,.oldval)
    可用的方法值为0 (NONE)1 (IMPLICIT)2 (EXPLICIT)

    隔离级别

    可以为发出查询的进程指定“隔离级别”。
    “隔离级别”选项允许指定正在进行的更改是否可用于查询的读访问。
    如果另一个并发进程正在执行对表的插入或更新,并且对表的更改在事务中,那么这些更改正在进行中,并且可能会回滚。
    通过为正在查询该表的流程设置ISOLATION LEVEL,可以指定是否希望在查询结果中包含或排除这些正在进行的更改。

    • READ UNCOMMITTED表示所有更改都可以立即用于查询访问。
      这包括随后可能被回滚的更改。
      READ UNCOMMITTED确保查询将在不等待并发插入或更新进程的情况下返回结果,并且不会因为锁定超时错误而失败。
      然而,READ UNCOMMITTED的结果可能包括未提交的值;
      这些值在内部可能不一致,因为插入或更新操作只部分完成,这些值可能随后被回滚。
      如果查询进程不在显式事务中,或者事务没有指定隔离级别,则READ UNCOMMITTED是默认值。
      READ UNCOMMITTEDREAD - WRITE访问不兼容;
      试图在同一语句中同时指定这两个变量会导致SQLCODE -92错误。
    • READ VERIFIED声明来自其他事务的未提交数据立即可用,并且不执行锁操作。
      这包括随后可能被回滚的更改。
      然而,与READ UNCOMMITTED不同的是,READ VERIFIED事务将重新检查任何可能因未提交或新提交的数据而失效的条件,这将导致不满足查询条件的输出。
      由于这种条件重新检查,READ VERIFIEDREAD UNCOMMITTED更准确,但效率更低,应该只在可能发生对条件检查的数据的并发更新时使用。
      READ VERIFIEDREAD - WRITE访问不兼容;
      试图在同一语句中同时指定这两个变量会导致SQLCODE -92错误。
    • READ COMMITTED表示只有那些已经提交的更改可以用于查询访问。
      这确保了在数据库上以一致的状态执行查询,而不是在进行一组更改时执行,这组更改随后可能会回滚。
      如果请求的数据已被更改,但更改尚未提交(或回滚),则查询将等待事务完成。
      如果在等待该数据可用时发生锁定超时,则会发出SQLCODE -114错误。

    READ UNCOMMITTED还是READ VERIFIED?

    下面的例子演示了READ UNCOMMITTEDREAD VERIFIED之间的区别:

    SELECT Name,SSN FROM Sample.Person WHERE Name >= 'M' 
    

    查询优化器可能首先选择从Name索引中收集所有RowID包含的符合>= 'M'条件的Name
    收集之后,每次访问一个RowID,以检索NameSSN字段用于输出。
    并发运行的更新事务可以将一个RowID 72PersonName字段从“Smith”更改为“Abel”,该字段位于查询的rowwid集合和它对表的逐行访问之间。
    在本例中,索引中的RowID集合将包含不再符合Name >= 'M'条件的行的RowID

    READ UNCOMMITTED查询处理假设Name >= 'M'条件已经被索引满足,并且将输出从索引中收集的每个RowID在表中出现的任何Name
    因此,在本例中,它将输出一个名称为'Abel'的行,该行不满足条件。

    READ VERIFIED查询处理注意到,它正在从表中为output (Name)检索一个字段,该字段参与了之前应该由索引满足的条件,然后重新检查条件,以防在检查索引之后字段值发生变化。
    在重新检查时,它注意到该行不再满足条件,并将其从输出中删除。
    只有输出所需的值才会重新检查其条件:在本例中,SELECT SSN FROM Person WHERE Name >= 'M'将输出RowID72的行。

    READ COMMITTED 异常

    ISOLATION LEVEL read committed生效时,可以通过设置ISOLATION LEVEL read committedSetOption()方法,如下SET status=$SYSTEM.SQL.Util.SetOption("IsolationMode",1,.oldval)
    SQL只能检索已提交数据的更改。
    然而,也有一些明显的例外:

    • 查询永远不会返回已删除的行,即使删除该行的事务正在进行,且删除可能随后回滚。
      ISOLATION LEVEL READ COMMITTED确保插入和更新处于一致状态,而不是删除。
    • 如果查询包含聚合函数,则聚合结果将返回数据的当前状态,而与指定的隔离级别无关。
      因此,聚合结果中包含正在进行的插入和更新(随后可能回滚)。
      正在进行的删除(随后可能会回滚)不包括在聚合结果中。
      这是因为聚合操作需要访问表中的许多行数据。
    • 包含DISTINCT子句或GROUP BY子句的SELECT查询不受隔离级别设置的影响。
      包含这些子句之一的查询将返回数据的当前状态,包括可能随后回滚的正在进行的更改。
      这是因为这些查询操作需要访问表中的许多行数据。
    • 带有%NOLOCK关键字的查询。

    注意:在使用ECP(企业缓存协议)的IRIS实现上,与READ UNCOMMITTED相比,使用READ COMMITTED可能会导致明显的性能下降。
    在定义包含ECP的事务时,开发人员应该权衡READ UNCOMMITTED的优越性能和READ COMMITTED的更高数据准确性。

    有效隔离级别

    可以使用set TRANSACTION(不启动事务)、START TRANSACTION(设置隔离模式并启动事务)或SetOption(“IsolationMode”)方法调用为进程设置隔离级别。

    指定的隔离级别保持有效,直到由SET TRANSACTIONSTART TRANSACTIONSetOption(“IsolationMode”)方法调用显式重置。
    由于COMMITROLLBACK仅对数据更改有意义,而对数据查询没有意义,因此COMMITROLLBACK操作对ISOLATION LEVEL设置没有影响。

    在查询开始时有效的“隔离级别”在查询期间仍然有效。

    可以使用GetOption(“IsolationMode”)方法调用确定当前进程的隔离级别。
    还可以使用SetOption(“IsolationMode”)方法调用为当前进程设置隔离模式。
    这些方法将READ UNCOMMITTED(默认值)指定为0,READ COMMITTED指定为1,READ VERIFIED指定为3。
    指定任何其他数值将保持隔离模式不变。
    如果将隔离模式设置为当前隔离模式,则不会发生错误或更改。
    以下示例显示了这些方法的使用:

    ClassMethod SetTransaction1()
    {
    	w $SYSTEM.SQL.GetOption("IsolationMode")," 默认",!
    	&sql(
    		START TRANSACTION ISOLATION LEVEL READ COMMITTED,READ WRITE
    	)
    	w $SYSTEM.SQL.GetOption("IsolationMode")," TART TRANSACTION之后",!
    	d $SYSTEM.SQL.SetOption("IsolationMode",0,.stat)
    	if stat=1 {
    		w $SYSTEM.SQL.GetOption("IsolationMode")," after IsolationMode=0 call",! 
    	} else { WRITE "Set IsolationMode error" 
    	}
    	&sql(COMMIT)
    }
    

    隔离模式和访问模式必须始终兼容。
    更改访问模式将更改隔离模式,示例如下:

    ClassMethod SetTransaction2()
    {
    	w $SYSTEM.SQL.GetOption("IsolationMode")," default",!
    	&sql(
    		SET TRANSACTION ISOLATION LEVEL READ COMMITTED,READ WRITE
    	)
    	w $SYSTEM.SQL.GetOption("IsolationMode")," after SET TRANSACTION",!
    	&sql(START TRANSACTION READ ONLY)
    	w $SYSTEM.SQL.GetOption("IsolationMode")," after changing access mode",!
    	&sql(COMMIT)
    }
    

    示例

    下面的嵌入式SQL示例使用两个SET TRANSACTION语句来设置事务参数。
    注意,SET TRANSACTION不会增加事务级别($TLEVEL)。
    START TRANSACTION命令启动一个事务并增加$TLEVEL:

    ClassMethod SetTransaction3()
    {
    	&sql(SET TRANSACTION %COMMITMODE EXPLICIT)
    	w !,"设置事务提交模式, SQLCODE=",SQLCODE
    	w !,"事务级别=",$TLEVEL
    	&sql(SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED)
    	w !,"设置事务隔离模式, SQLCODE=",SQLCODE
    	w !,"事务级别=",$TLEVEL
    	&sql(START TRANSACTION)
    	w !,"开始事务, SQLCODE=",SQLCODE
    	w !,"事务级别==",$TLEVEL
    	&sql(SAVEPOINT a)
    	w !,"设置保存点, SQLCODE=",SQLCODE
    	w !,"事务级别==",$TLEVEL
    	&sql(COMMIT)
    	w !,"提交事务, SQLCODE=",SQLCODE
    	w !,"事务级别==",$TLEVEL
    }
    
    
    DHC-APP>d ##class(PHA.TEST.SQLCommand).SetTransaction3()
     
    设置事务提交模式, SQLCODE=0
    事务级别=0
    设置事务隔离模式, SQLCODE=0
    事务级别=0
    开始事务, SQLCODE=0
    事务级别==1
    设置保存点, SQLCODE=0
    事务级别==2
    提交事务, SQLCODE=0
    事务级别==0
    
    展开全文
  • 我正在用C++写入SQL Server数据库。...ROLLBACK TRANSACTION请求在SQL Server之后没有对应的BEGIN TRANSACTION错误8114然后我发送一个或多个SQL语句到服务器。如果一切顺利,我在SQLTransaction对象...

    我正在用C++写入SQL Server数据库。我有一个叫做SQLTransaction的对象,它在代码块的开头创建时,向SQL Server发送'begin transaction'。ROLLBACK TRANSACTION请求在SQL Server之后没有对应的BEGIN TRANSACTION错误8114

    然后我发送一个或多个SQL语句到服务器。如果一切顺利,我在SQLTransaction对象中设置一个标志,让它知道这组命令进行得很顺利。当SQLTransaction对象超出范围时,它会根据标志的状态向服务器发送“提交事务”或“回滚事务”。

    它看起来是这样的:

    {

    TSQLTransaction SQLTran();

    try

    {

    Send(SomeSQLCommand);

    }

    catch(EMSError &e)

    {

    InformOperator();

    return;

    }

    SQLTran.commit();

    }

    我发送一个指挥不力,这些方框的一个有一个SQL语句和命令扔了SQL错误8114

    错误转换数据类型varchar数字

    我已经修复了这个问题。我不明白的事实是,我还收到第二个SQL错误消息

    ROLLBACK TRANSACTION请求没有对应的BEGIN TRANSACTION。

    我找不到任何告诉我这个事务可以或不应该在故障后回滚的东西。

    这个完全相同的SQLTransaction对象在我的应用程序的许多地方使用,似乎总是工作正常,直到现在。出于某种原因,这个SQL错误似乎被区别对待。是否有一些SQL Server自动回滚的错误?我真的很想了解这里发生了什么。

    感谢

    2017-02-11

    Kevin

    +0

    为什么你不能把事务逻辑放在SQL语句中? –

    展开全文
  • <sql:transaction> 标签

    2021-01-19 16:16:00
    prefix="sql"%> JSTL sql:transaction Tag url="jdbc:mysql://localhost/TEST" user="root" password="cohondob"/> ("2001/12/16"); int studentId = 100; %> UPDATE Students SET last = 'Ali' WHERE Id = 102 ...

    标签

    标签用来将标签和标签封装至事务中。可以将大量的和操作装入中,使它们成为单一的事务。

    它确保对数据库的修改不是被提交就是被回滚。

    语法格式

    属性

    标签有如下属性:

    属性

    描述

    是否必要

    默认值

    dataSource

    所使用的数据库(覆盖默认值)

    默认数据库

    isolation

    事务隔离等级 (READ_COMMITTED,,READ_UNCOMMITTED, REPEATABLE_READ或 SERIALIZABLE)

    数据库默认

    实例演示

    首先,需要在TEST数据库中建一个Employees表,然后往表中添加几条记录,具体操作步骤如下:

    步骤1:

    打开CMD,将目录转至安装目录下:

    C:\>

    C:\>cd Program Files\MySQL\bin

    C:\Program Files\MySQL\bin>

    步骤2:

    登陆数据库:

    C:\Program Files\MySQL\bin>mysql -u root -p

    Enter password: ********

    mysql>

    步骤3:

    在 TEST 数据库中建立 Students 表:

    mysql> use TEST;

    mysql> create table Students

    (

    id int not null,

    first varchar (255),

    last varchar (255),

    dob date

    );

    Query OK, 0 rows affected (0.08 sec)

    mysql>

    创建数据记录:

    最后,在 Students 表中创建几条记录:

    mysql> INSERT INTO Students

    VALUES (100, 'Zara', 'Ali', '2002/05/16');

    Query OK, 1 row affected (0.05 sec)

    mysql> INSERT INTO Students

    VALUES (101, 'Mahnaz', 'Fatma', '1978/11/28');

    Query OK, 1 row affected (0.00 sec)

    mysql> INSERT INTO Students

    VALUES (102, 'Zaid', 'Khan', '1980/10/10');

    Query OK, 1 row affected (0.00 sec)

    mysql> INSERT INTO Students

    VALUES (103, 'Sumit', 'Mittal', '1971/05/08');

    Query OK, 1 row affected (0.00 sec)

    mysql>

    现在编写JSP文件,使用和来执行SQL UPDATE语句。在中的代码不是执行完,就是一个都不执行:

    pageEncoding="UTF-8"%>

    JSTL sql:transaction Tag

    url="jdbc:mysql://localhost/TEST"

    user="root" password="cohondob"/>

    Date DoB = new Date("2001/12/16");

    int studentId = 100;

    %>

    UPDATE Students SET last = 'Ali' WHERE Id = 102

    UPDATE Students SET last = 'Shah' WHERE Id = 103

    INSERT INTO Students

    VALUES (104,'Nuha', 'Ali', '2010/05/26');

    SELECT * from Students;

    Emp IDFirst NameLast NameDoB

    运行结果如下:

    ec325f6fd44c3b535a74a759e66d7ee1.png

    展开全文
  • SQLAlchemy学习笔记(一) 为什么要使用SQLAlchemy? 将你的代码抽象出来不依赖与数据库的类型和某种数据库自身的的独特性,SQLAlchemy提供了强大又通用的语句和类型,你不在需要考虑你所选用数据库的实现及其厂商...
  • 通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性当对多个表进行更新的时候,某条执行失败。为了保持数据的完整性,需要使用事务回滚。显示设置事务代码如下复制代码begin try...
  • 未提交事务长期未提交事务,指开启事务后,长时间未向MySQL发出SQL执行请求或事务处理(COMMIT/ROLLBACK)请求,在系统表`information_schema`.`INNODB_TRX` 中状态为RUNNING,而在`information_schema`.`PROCESSLIST`...
  • 文章目录 第七十五章 SQL命令 START TRANSACTION大纲参数描述设置参数%COMMITMODE隔离级别READ UNCOMMITTED还是READ VERIFIED?READ COMMITTED异常有效隔离级别ObjectScript和SQL事务示例 第七十五章 SQL命令 START ...
  • 目录问题解决方案参考 ...为了保证,关闭sql_log_bin和更新操作,是在同一个连接上,我们会想到使用事务transaction。 但在使用事务过程中,遇到如下报错: Error 1694: Cannot modify @@session.sql_log_bin ins
  • I am getting this error when I try to close a connection after running a query.If I commit the transaction after the query, I don't get the error. As far as I am aware queries are not part of transact...
  • 文章目录 第六十七章 SQL命令 ROLLBACK大纲参数描述不回滚回滚日志事务挂起ObjectScript事务命令 第六十七章 SQL命令 ROLLBACK 回滚事务。 大纲 ROLLBACK [WORK] ROLLBACK TO SAVEPOINT pointname 参数 point...
  • Type Exception Report ... nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java
  • 将MySQL的Maven依赖升为5.1.6版本 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version>...
  • 1、根据异常信息java.sql.SQLException:Thetransactionisnolongeractive-status:'Markedrollback.来看,jdbc连接已关闭但仍在此事物中进行数据库操作导致的问题;建议去查看下eos-governor中执行sql语句较长的情况。...
  • 语法 xid: gtrid [, bqual [, formatID ]] gtrid is a global transaction identifier bqual is a branch qualifier formatID is an unsigned integer XA...0x623030303031,0x1 参考文档 XA Transaction SQL Statements
  • 从git上下载项目导入idea中报如下错误: 错误1:Driver does not support get/set network timeout for connections. 错误2:CLIENT_PLUGIN_AUTH is required 错误3:Unknown character set: ‘utf8mb4’ ...
  • 事务性语句和锁定语句START TRANSACTION、COMMIT和ROLLBACK语句START TRANSACTION[transaction_characteristic [, transaction_characteristic] ...]transaction_characteristic: {WITH CONSISTENT SNAPSHOT| READ ...
  • RECHARGE:业务,数据: {"platformUserNo":"RPD_1512632756191","amount":6000,"rechargeWay":"SWIFT","bankcode":"ICBK","payCompany":"LANMAO","payMobile":"13428284220","transactionTime":"20171228...
  • using(var tran = con.BeginTransaction()) { try { string testsql = "update test_current set value = '" + parameter.VALUE + "'"; db.Database.ExecuteSqlCommand(testsql); db.SaveChanges(); //testsql = ...
  • 有个客户跟我说,他们把weblogic从923升级到923以后,总是提示failed to resume transaction的。当时没有看到任何信息,以为跟JTA超时有关,让客户把JTA timeout加大,同时把下面的设置加入jdbc-config.xml中。客户...
  • I've the following code that gets a json recordset and insert some data in three different tables on the client Web Sql storage.How can I intercept the end of databaseSync() function?What I want to do...
  • 不知道是不是框架的原因 , 我是小白用户```java.lang.RuntimeException: java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transactionat cn.ffcs.memory.Memory.batch(Memory.java:146)...
  • org.postgresql.util.PSQLException: ERROR:current transaction is aborted, commands ignored until end of transaction block概要:得到此错误的原因是因为您输入了一个事务,并且您的一个SQL查询失...
  • 实现功能:在sqlserver里面实现事务处理,保证数据库操作安全;接收sqlserver存储过程输出的各种状态的值。sqlserver里面的存储过程如下:ALTER PROC PK_Shop_Member@nUserID INT,@nMoney BIGINT,@DATE DATETIME,@...
  • SQL trigger(触发器)

    2021-04-12 13:55:05
    五:使用T-SQL语句来创建触发器 基本语句如下: create trigger trigger_name on {table_name | view_name} {for | After | Instead of } [ insert, update,delete ] as sql_statement 六:删除触发器: 基本语句如下:...
  • Mysql的transaction实现

    2021-01-18 22:50:24
    transaction在数据库编程中是一个重要的概念,这样做可以控制对数据库操作的事务提交。...这篇文章是针对mysql的,讲述从数据库安装,设置,一直到sql语句,甚至到java程序中,如何实现transaction。1.安装要想在m...
  • 【实施工程师】必备技能——事务操作 目录 【实施工程师】必备技能——事务操作 mysql开启事务: mysql提交事务: mysql事务回滚: ...1、开启事务并执行【增删改】语句测试 ...在默认情况下,用户执行...START TRANSACTION
  • Cannot commit transaction: (3902,b'The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION. DB-Lib error message 20018, severity 16:\nGeneral SQL Server error:Check messages from the SQL...
  • sql文件怎么打开

    2021-04-21 02:13:54
    sql文件怎么打开SQL是具有数据操纵和数据定义等多种功能的数据库语言,这种语言具有交互性特点,能为用户提供极大的便利,数据库管理系统应充分利用SQL语言提高计算机应用系统的工作质量与效率。下面是小编为大家...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 304,225
精华内容 121,690
关键字:

sqltransaction