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 ...
随机推荐
- Numpy的ndarry
Numpy的ndarry:一种多维数组对象 Numpy最重要的一个特点就是其N维数组对象(即ndarry),该对象是一个快速而灵活的大数据集容器.你可以利用这种数组对整块数据执行一些数学运算,其语法跟 ...
- keil里面填数据
编译后寄存器和堆栈的内存数据可以直接写进去的. 寄存器,双击就可以,注意里面是十六进制 堆栈,也是十六进制,八位的 00 00 00 00 ,但这个是从右到左的,比如0x00000006 应该填 06 ...
- 「小程序JAVA实战」小程序多媒体组件(27)
转自:https://idig8.com/2018/08/19/xiaochengxujavashizhanxiaochengxuduomeitizujian27/ 来说下 ,小程序的多媒体组件.源码 ...
- 9.redis安全
转自:http://www.runoob.com/redis/redis-tutorial.html Redis 安全 我们可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis ...
- 使用ffmpeg合并视频文件的三种方法
ffmpeg合并视频的方法有三种.国内大多数仅介绍了其中之一.于是觉得有必要翻译一下.其实在ffmpeg的 FAQ文档中有比较详细的说明. 使用concat协议进行视频文件的合并 这种方式的适用场景是 ...
- Yum -y update 报错
问题描述: 操作系统:CentOS 6.5 今天服务器上执行 yum -y update 命令时,提示: Running rpm_check_debug ERROR with rpm_check_de ...
- Linux 入门知识一(附上如何解决Ubuntu的root密码问题)
.centos有拥有七个控制台,其中第一到第六个是字符界面,第七个是图形界面 切换的快捷键是ctrl+shift+fn(n为自然数) 输入tty的话,可以检查当前处于哪个控制台 如何在cent ...
- Renderer.materials 和sharedMaterials一些用法上的区别
Not allowed to access Renderer.materials on prefab object. Use Renderer.sharedMaterials insteadUnity ...
- [C++] NULL VS nullptr
NULL VS nullptr
- TF Boys (TensorFlow Boys ) 养成记(四):TensorFlow 简易 CIFAR10 分类网络
前面基本上把 TensorFlow 的在图像处理上的基础知识介绍完了,下面我们就用 TensorFlow 来搭建一个分类 cifar10 的神经网络. 首先准备数据: cifar10 的数据集共有 6 ...