在很多编程语言中,可以实现嵌套,但在TSQL中,可以实现嵌套事务吗?

答案:不可以

虽然我们可以写如下code:

CREATE TABLE #TB1

(

ID INT

)

--创建事务1

BEGIN TRAN TR1

INSERT INTO #TB1

SELECT 1

--在事务1中创建事务2

BEGIN TRAN TR2

INSERT INTO #TB1

SELECT 2

--回滚事务

ROLLBACK TRAN

SELECT * FROM #TB1

DROP TABLE #TB1

以上代码能够正常运行,且事务1和事务2都被回滚,看似实现了嵌套事务,但是我们在事务1中,不能指定回滚事务2,以下代码会出错:

CREATE TABLE #TB1

(

ID INT

)

--创建事务1

BEGIN TRAN TR1

INSERT INTO #TB1

SELECT 1

--在事务1中创建事务2

BEGIN TRAN TR2

INSERT INTO #TB1

SELECT 2

--尝试回滚事务2

ROLLBACK TRAN TR2

--在尝试提交事务1

COMMIT TRAN TR1

SELECT * FROM #TB1

DROP TABLE #TB1

以上错误是对事务的一种错误认识,以其他编程的思想去编写TSQL,我们知道事务可以提交和回滚,所以我们尝试用嵌套事务来实现部分回滚,其实我们只需要一个事务,并在最终决定提交事务还是回滚事务,在事务中,如果需要部分回滚,我们只需使用事务保存点便可以实现:

CREATE TABLE #TB1

(

ID INT

)

--创建事务1

BEGIN TRAN TR1

INSERT INTO #TB1

SELECT 1

--创建事务保存点1

SAVE TRAN savepoint1

INSERT INTO #TB1

SELECT 2

--将事务回滚到事务检查点1之前

ROLLBACK TRAN savepoint1

COMMIT TRAN TR1

SELECT * FROM #TB1

DROP TABLE #TB1

结论:

1.可以在一个事务中创建一个新的事务,但无法使之嵌套,即内层事务相对于外层事务而言独立存在,任何回滚都将回滚所有事务,且这些“嵌套”事务间无隔离性。

2.要想在事务里进行部分回滚,可以使用事务保存点来实现。

Transaction And Lock--存在嵌套事务吗?的更多相关文章

  1. Transaction recovery: lock conflict caught and ignored

    Transaction recovery: lock conflict caught and ignored环境:RAC 4节点.oracle 11.2.0.4.redhat 5.9 64bit 问题 ...

  2. 记一次 oracle 12.2 RAC : Transaction recovery: lock conflict caught and ignored

    节点一 alert日志: PDB(17):Transaction recovery: lock conflict caught and ignored PDB(17):Transaction reco ...

  3. ORACLE查看锁(lock)情况

      SELECT /*+ RULE */         ls.osuser os_user_name,          ls.username user_name,          DECODE ...

  4. MySQL_事务没有提交导致 锁等待 Lock wait timeout exceeded

    java.lang.Exception:### Error updating database.  Cause: java.sql.SQLException: Lock wait timeout ex ...

  5. MySQL 事务没有提交导致 锁等待 Lock wait timeout exceeded

    java.lang.Exception: ### Error updating database.  Cause: java.sql.SQLException: Lock wait timeout e ...

  6. Oracle常用SQL查询(2)

    三.查看数据库的SQL 1 .查看表空间的名称及大小 select  t.tablespace_name,  round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...

  7. Oracle常用语句集合

    oracle常用经典SQL查询 常用SQL查询: .查看表空间的名称及大小 )),) ts_size from dba_tablespaces t, dba_data_files d where t. ...

  8. insert操作卡死的处理过程

    insert操作卡死的处理过程 先看看insert为什么被卡死 SQL> select sql_id from v$sql where sql_text like 'delete from st ...

  9. Oracle以及SDE维护常用命令-查看表空间等

    之前现场反馈一个数据更新的问题,查看感觉是因为表空间满了导致的(错误在之前的博客随笔中写过),因此远程对服务器进行查看.个人平常都是通过Oracle客户端的Entreprise Manager Con ...

随机推荐

  1. VS Code 在新Tabs打开文件

    添加如下设置即可 "workbench.editor.enablePreview": false

  2. jsp get 乱码

    String str=request.getParameter("name");str=new String(str.getBytes("iso8859-1") ...

  3. 如何显示当前Mipmap级别?

    [如何显示当前Mipmap级别?] 乘以 mainTextureSize/mipTextureSize是为了让mipColorsTexture纹理与mainTexture级别对应.直接用uv是不行的, ...

  4. 146. LRU Cache (List, HashTable)

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  5. linux 安装天气插件

    1. 用命令 sudo apt install gnome-shell-extension-weather 安装插件 但是在那之前你安装了 GNOME Shell Extensions 如果没有安装 ...

  6. [C++] NULL VS nullptr

    NULL VS nullptr

  7. Java操作XML的工具:JAXB

    JavaArchitecture for XML Binding (JAXB) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...

  8. Java中的Set,List,Map的区别

    1. 对JAVA的集合的理解是想对于数组 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 ja ...

  9. Jrebel 独立部署tomcat 远程同步项目

    一直在用 jrebel 感觉热部署的 功能,修改xml配置文件等,省去了很多的重新启动的时间. 由于偶然间发现 jrebel 还有remote 路由功能.这样,在服务器端用jrebel部署的项目和本地 ...

  10. 斐波那契数列—java实现

    最近在面试的时候被问到了斐波那契数列,而且有不同的实现方式,就在这里记录一下. 定义 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...