回滚保存点后究竟发生了什么?
一、rollback保存点的锁释放
在保存点后如果做了操作造成了行锁,是否rollback回来后还会保留操作时引起的行锁?
设计:在保存点后进行delete操作,查看rollback之前和之后的事务锁变化。
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> savepoint a;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t5; ###保存点状态
+------+------+
| id | num |
+------+------+
| 2 | aa |
| 3 | c |
+------+------+
2 rows in set (0.00 sec)
mysql> delete from t5 where id=2; ###更改操作
Query OK, 1 row affected (0.00 sec)
mysql> rollback to a; ####回滚到保存点时
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t5; ###rollback后数据还原到事务保存点状态,即撤销delete操作
+------+------+
| id | num |
+------+------+
| 2 | aa |
| 3 | c |
+------+------+
2 rows in set (0.00 sec)
show engine innodb status;
rollback之前
------------
TRANSACTIONS
------------
Trx id counter 18044
Purge done for trx's n:o < 18041 undon:o < 0 state: running but idle
History list length 566
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 18037, not started
MySQL thread id 272, OS thread handle0x7f61312b0700, query id 79768 localhost root init
show engine innodb status
---TRANSACTION 18039, ACTIVE 17 sec
2 lock struct(s), heap size 360, 3 rowlock(s), undo log entries 1 ###delete造成锁形成
MySQL thread id 274, OS thread handle0x7f60bd82d700, query id 79767 localhost root cleaning up
Trx read view will not see trx with id>= 18040, sees < 18040
Rollback之后
------------
TRANSACTIONS
------------
Trx id counter 18046
Purge done for trx's n:o < 18045 undon:o < 0 state: running but idle
History list length 567
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 18037, not started
MySQL thread id 272, OS thread handle0x7f61312b0700, query id 79771 localhost root init
show engine innodb status
---TRANSACTION 18045, ACTIVE 5 sec
MySQL thread id 274, OS thread handle0x7f60bd82d700, query id 79770 localhost root cleaning up
Trx read view will not see trx with id>= 18046, sees < 18046
###锁已经被释放
结论:
Rollback释放了savepoint后delete操作的行锁。
二、回滚保存点只撤销本事务保存点后的操作
回滚保存点后,是否撤销了保存点后其他的事务对数据进行修改?
设计:设置保存点,事务二对no_index表进行update操作,然后回滚保存点,比较回滚前后数据变化。
set tx_isolation='read_committed';
事务一
mysql> start transaction ;
Query OK, 0 rows affected (0.00 sec)
mysql> savepoint modi;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from no_index; ###事务二对no_index表操作前
+------+------+------+
| id | fir | sec |
+------+------+------+
| 1 | aa | bb |
| 3 | b | c |
| 4 | c | d |
| 5 | e | f |
| 7 | e | q |
| 8 | cd | qq |
| 11 | a | b |
+------+------+------+
7 rows in set (0.00 sec)
mysql> select * from no_index; ###事务二对no_index表操作后
+------+------+------+
| id | fir | sec |
+------+------+------+
| 1 | aa | b |
| 3 | b | c |
| 4 | c | d |
| 5 | e | f |
| 7 | e | q |
| 8 | cd | qq |
| 11 | a | b |
+------+------+------+
7 rows in set (0.00 sec)
mysql> rollback to modi;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from no_index; ####回滚到保存点后数据没有发生变化
+------+------+------+
| id | fir | sec |
+------+------+------+
| 1 | aa | b |
| 3 | b | c |
| 4 | c | d |
| 5 | e | f |
| 7 | e | q |
| 8 | cd | qq |
| 11 | a | b |
+------+------+------+
7 rows in set (0.00 sec)
事务二
mysql> update no_index set sec='b' whereid='1'; ###对表进行update操作
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> rollback to modi; ###可以看出保存点依附于事务中
ERROR 1305 (42000): SAVEPOINT modi does notexist
结论:
1.保存点回滚只是撤销本事务保存点后的操作,对保存点后其他事务的操作不凑效。
2.保存点的声明和定义只在本事务中凑效,而且当本事务commit或rollback后,保存点也不复存在。
转载于:https://blog.51cto.com/10574662/1688446
回滚保存点后究竟发生了什么?相关推荐
- 多方法调用 一个出错 集体回滚_一个@Transaction哪里来这么多坑?
前言 在之前的文章中已经对Spring中的事务做了详细的分析了,这篇文章我们来聊一聊平常工作时使用事务可能出现的一些问题(本文主要针对使用@Transactional进行事务管理的方式进行讨论)以及对 ...
- Spring嵌套事务是怎么回滚的?
事务的传播机制 多数据源的切换问题 更深入理解 Spring 事务. 用户注册完成后,需要给该用户登记一门PUA必修课,并更新该门课的登记用户数. 为此,我添加了两个表. 课程表 course,记录课 ...
- mysql 事务 回滚 原理_mysql 事务的实现原理
一. 开篇 相信大家都用过事务以及了解他的特点,如原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability)等.今天想跟大家一起研究 ...
- Mysql事务回滚机制与原理
Mysql事务回滚机制与原理 文章目录 Mysql事务回滚机制与原理 一.事务回滚机制 二.使用到的技术讨论 三.redo log和undo log介绍 3.1 redo log 3.2 undo l ...
- 每日一博 - 常见的Spring事务失效事务不回滚案例集锦
文章目录 事务不生效 方法内部调用 修复方法一 : [新加一个Service方法] 修复方法二:[在该Service类中注入自己] 修复方法三:[通过AopContent类]<---- 推荐 访 ...
- sql server 事务_如何使用显式SQL Server事务回滚
sql server 事务 In this article, we will explore the process of rollback an explicit SQL Server transa ...
- 详解spring事务失效和回滚失败的场景
详解spring事务失效和回滚失败的场景 详解spring事务失效和回滚失败的场景 前言 一 .事务不生效 1.访问权限问题 2. 方法用final修饰 3.方法的内部调用 3.1 新加一个Servi ...
- service层的方法上使用@Transactional注解,程序发生异常没有回滚
场景:程序在运行过程中发生了异常,虽然使用了@Transactional对方法进行注解,但是事务并没有回滚. 解决方案:经检查发现,在service层的方法中使用了try...catch关键字,导致发 ...
- 【java基础】子线程任务发生异常,主线程事务如何回滚?
文章目录 一.提出问题 二.主线程与子线程 三.线程池 四.异常的捕获 五.事务的回滚 一.提出问题 最近有一位朋友问了我这样一个问题,问题的截图如下: 这个问题问的相对比较笼统,我来稍微详细的描述下 ...
最新文章
- freebasic 编译linux,免费BASIC编译器下载
- 使用Silverlight 2实现水中倒影效果
- 创建安卓app的30个经验教训
- 思科查看服务器启动配置文件,启动配置检查UCS
- 港中文开源 | 融合视频目标检测与单目标、多目标跟踪
- 开源xen对比_女实习生在Xen Project上摇摆开源
- 转转集团Q4手机行情:二手市场iPhone交易量今年以来首次“反弹”
- 稳定服务器头像,WordPress 修复 Gravatar 头像稳定服务器地址
- [已解决] org.hibernate.HibernateException:未配置CurrentSessionContext
- spss clementine Twostep Cluster(两步聚类 二阶聚类)
- centos刻录工具_CentOS7.0 U盘刻录工具正式版
- oracle数据库还原指令,oracle中备份和还原数据库的命令汇总
- OpenNLP初尝试--自然语言处理
- link标签的主要用法
- base64编码计算机网络,什么是Base64(Base64)?
- python中缺省值处理函数DataFrame.fillna()
- DataMining——孤立点:落在高于Q1 或低于Q3 的1.5IQR的位置
- 关于混入(minxs)的使用
- 正点原子IIC例程讲解笔记(三)——24cxx.c中函数理解
- 心理学 | (1)焦虑症和恐惧症--一种认知的观点
热门文章
- mysql YEARWEEK(date[,mode]) 函数
- 北京5万份数字人民币红包来袭,系“冬奥试点”首次面向公众测试!
- 关于测试网 gladios 节点公开部署
- 最新热点资讯:多条国际客运航线复航,涉及欧洲、亚洲多个城市
- 计算机网络配置与应用教学设计,计算机网络与应用教学设计
- 《Linux命令行大全》学习笔记1——学习 Shell
- 暗通道先验算法matlab
- Google Earth Engine(GEE) 01-中输入提示快捷键Ctrl+space无法使用的问题
- Time Series Forecasting Using GRU Neural Network with Multi-lag After Decomposition
- ArcGIS总结——矢量数据分析之网络分析(上)