Transaction And Lock--存在嵌套事务吗?
在很多编程语言中,可以实现嵌套,但在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--存在嵌套事务吗?的更多相关文章
- 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 问题 ...
- 记一次 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 ...
- ORACLE查看锁(lock)情况
SELECT /*+ RULE */ ls.osuser os_user_name, ls.username user_name, DECODE ...
- MySQL_事务没有提交导致 锁等待 Lock wait timeout exceeded
java.lang.Exception:### Error updating database. Cause: java.sql.SQLException: Lock wait timeout ex ...
- MySQL 事务没有提交导致 锁等待 Lock wait timeout exceeded
java.lang.Exception: ### Error updating database. Cause: java.sql.SQLException: Lock wait timeout e ...
- Oracle常用SQL查询(2)
三.查看数据库的SQL 1 .查看表空间的名称及大小 select t.tablespace_name, round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...
- Oracle常用语句集合
oracle常用经典SQL查询 常用SQL查询: .查看表空间的名称及大小 )),) ts_size from dba_tablespaces t, dba_data_files d where t. ...
- insert操作卡死的处理过程
insert操作卡死的处理过程 先看看insert为什么被卡死 SQL> select sql_id from v$sql where sql_text like 'delete from st ...
- Oracle以及SDE维护常用命令-查看表空间等
之前现场反馈一个数据更新的问题,查看感觉是因为表空间满了导致的(错误在之前的博客随笔中写过),因此远程对服务器进行查看.个人平常都是通过Oracle客户端的Entreprise Manager Con ...
随机推荐
- java设计模式之责任链模式(Chain of Responsibility)
转自:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html 在阎宏博士的<JAVA与模式>一书中开头是这样 ...
- SpringBoot入门之spring-boot-maven-plugin
spring-boot-maven-plugin插件是将springboot的应用程序打包成fat jar的插件.首先我们说一下啥叫fat jar.fat jar 我们暂且叫他胖jar吧,实在是找不到 ...
- 【308】Python os.path 模块常用方法
参考:Python os.path 模块 参考:python3中,os.path模块下常用的用法总结 01 abspath 返回一个目录的绝对路径. 02 basename 返回一个目录的基名 ...
- 【302】C# TreeView 控件使用说明
参考:C# 中treeview 树节点图标的动态加载,及选中时图标改变 参考:C# TreeView 控件的综合使用方法 参考:TreeView 类 参考:TreeNode 类 1. 添加根和子级 通 ...
- Spring注解配置Aop
之前学习了SpringAop的基本原理.http://www.cnblogs.com/expiator/p/7977975.html 现在尝试使用注解来配置SpringAop. Aop,面向切面编程. ...
- NSArray 快速求和、平均值、最大值、最小值
在iOS开发中我们经常遇到一个需求,求一个数组的所有元素的和,最大值,最小值或者平均值,有的开发者可能第一想到的是for循环遍历求解,其实苹果提供了更简便的方式.如下: NSArray *arr = ...
- XPath在python中的高级应用
XPath在python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但XPath明显比re具有优势,在网页分析上使re退居二线. XPath介绍: ...
- mysql sql left right inner join区别及效率比较
一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...
- 全新的css网站布局--Grid布局
Grid布局全新的css网站布局 CSS Grid 布局由两个核心组成部分是 wrapper(父元素)和 items(子元素). wrapper 是实际的 grid(网格),items 是 grid( ...
- 三个参数,对mysql存储限制的影响
1.max_allowed_packet 这个参数会影响单此插入或读取的包的大小,一般和blob字段共用,但要注意一点是这个参数好像是分服务端与客户端的,如果想输出大字段的内容,则在用客户端链接服务 ...