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 ...
随机推荐
- android 2.3.3 配置github的两步骤
第一步:配置GitHub的总账号(Version Control) 第二步:配置具体的仓库(仓库名称你从GitHub网上添加)
- data-ajax="false"
转自:https://yq.aliyun.com/ziliao/265393 最近在做一个项目,由于涉及到跨平台性,所以采用了jquerymobile这个框架,在开发过程中,一开始为了图测试方便,采用 ...
- SpringData JPA 接口和方法
1.1 简单查询--接口方法 1.2 五个接口详解 1.2.1 CrudRepository接口 其中T是要操作的实体类,ID是实体类主键的类型.该接口提供了11个常用操作方法. @NoRepo ...
- arcserver 跨域问题
http://resources.arcgis.com/en/help/rest/apiref/config.html#jcrossOriginAccesshttp://enable-cors.org ...
- 笔记-TCPCLIENT
]; private void ReceiveMessage() { try { tcpClient = );//创建TcpClient对象实例 } catch (Exception le) { } ...
- linux tar 压缩
压缩文件 tar -czvf xxx.tar.gz yourdict 解压文件 tar xzf aa.tar.gz
- sudo问题汇总
1. 注释Defaults requiretty Defaults requiretty修改为 #Defaults requiretty, 表示不需要控制终端. 否则会出现sudo: sorry, y ...
- svm原理及opencv
转自http://www.cnblogs.com/justany/archive/2012/11/23/2784125.html
- Openssl genrsa命令
一.简介 生成RSA私有密钥 二.语法 openssl genrsa [-out filename] [-passout arg] [-f4] [-] [-rand file(s)] [-engine ...
- vim调用替换文件内容
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :n,$s/vivian/sky/ 替换 ...