关于脏数据比如说,有两个用户A,B同时操作数据库,A开始了一个事务,修改了某行,但还未提交,这个时

关于脏数据比如说,有两个用户A,B同时操作数据库,A开始了一个事务,修改了某行,但还未提交,这个时

提问者: lwk2008      发布时间:2014-08-02      浏览:113      回复:0      悬赏:0.0希赛币
2016上半年软考辅导培训,火热招生中!网络直播+课程录播+在线答疑+真题模拟
关于脏数据
比如说,有两个用户A,B同时操作数据库,A开始了一个事务,修改了某行,但还未提交,这个时候,B开始另一个事务,读取了该行,然后A回滚了事务,即修改被取消了,那么,B读取到的那一行数据就是脏数据

上面这句话正确吗?如果事物A未提交,事物B能读到A所修改的数据吗?

如何判断A,B 是否属于同一个事物?

在PL/SQL 中先删一条数据(没有提交)紧接着在查刚才那条数据是查不到的,既然没有提交为什么会查不到呢?

希望各位能详细回答一下,小弟不胜感激。

Q:如果事物A未提交,事物B能读到A所修改的数据吗?
A:当然看不到

Q:如何判断A,B 是否属于同一个事物?
A:这个应该不用判断吧,两次连接 就是属于两个“事物”

Q:在PL/SQL 中先删一条数据(没有提交)紧接着在查刚才那条数据是查不到的,既然没有提交为什么会查不到呢?
A:因为这个是一个“事物”中,例如你在plsql developer中开启另一个窗口,就可以查到了。

“A开始了一个事务,修改了某行,但还未提交,这个时候,B开始另一个事务,读取了该行”,因为A没有提交,B读取的是A修改前的数据。没有提交的数据只有自己能查询到,其他用户是查看不到的。
建议你多看看这方面的资料吧

楼主首先要弄清楚 事务是为了保证数据完整性的 
A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据
但是 在A事务中查询的话 查到的都是操作之后的数据
这个很好理解 你开两个sql窗口 在一个里边给一个表insert一条数据 不提交 紧接着select 有数据 但是去另一个sql窗口select 就没有数据 


这个要看数据库工作在哪个隔离级别.只有在read uncommitted的时候才会出现脏读.
而oracle只支持read committed和read serialization两种,所以不会出现你说的情况.

A没有提交之前,B只能看到行修改之前的数据,这是undo表空间的作用之一:维护数据的一致性.

引用:

  楼主首先要弄清楚 事务是为了保证数据完整性的 
A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据
但是 在A事务中查询的话 查到的都是操作之后的数据
这个很好理解 你开两个sql窗口 在一个里边给一个表insert一条数据 不提交 紧接着select 有数据 但是去另一个sql窗口select 就没有数据


+1

去查下隔离级别和脏读,不可重复读,幻读等现象的关系就明白了.

Oracle 如何设置事务隔离级别去让 B 也看到 A 正在改的那个数据?


该回复于2011-04-14 10:49:26被版主删除

A没有提交之前,B只能看到行修改之前的数据,这是undo表空间的作用之一:维护数据的一致性.

没有提交的数据只有自己看得到,并没有update到数据库。

因为他只是在内存中修改,并没有被持久化

该回复于2012-07-31 14:23:34被版主删除

在A对数据进行写操作的时候,这时候这部分数据在缓冲区有一个备份数据。没有提交的话,是不会改变的,脏数据是提交但是没有保存到磁盘的数据。

受教了
条回答
<think>嗯,用户的问题是关于SpringBoot事务管理的。具体来说,他们想知道当数据库删除操作和读取外部文件在同一个事务里,如果读取文件失败,数据库操作会不会回滚。我需要先理解事务的基本机制,然后看看文件操作是否在事务管理范围内。首先,Spring的事务管理主要是针对数据库操作的。记得引用3里提到,Spring会关闭自动提交,把多个数据库操作放在一个事务里,要么全部提交,要么全部回滚。所以,数据库删除操作在这里应该会被事务管理。但问题在于读取外部文件。文件操作属于外部系统,比如文件系统,而Spring的事务默认只管理数据库事务,不会涉及文件系统。比如,如果读取文件抛出了异常,Spring会回滚数据库操作吗?根据之前的知识,事务回滚通常是在发生运行异常或Error触发。如果文件读取失败,抛出了异常,并且这个异常是RuntimeException的话,事务会回滚。但如果是检查型异常(checkedexception),可能需要配置@Transactional的rollbackFor属性。 不过用户的情况是文件读取失败,可能抛出IOException,这是一个检查型异常。默认情况下,Spring不会回滚这种异常,除非明确指定。所以用户需要确保在事务注解里包含rollbackFor =IOException.class,或者将异常包装成RuntimeException抛出。外,用户提到的数据库删除和文件读取在同一个事务中。如果文件读取是在事务方法内部,并且抛出异常,那么事务会标记为回滚,数据库删除操作就不会提交。但如果文件读取是在事务之外,或者以非事务方式执行,那可能不会触发回滚。所以需要确保这两个操作在同一个事务方法里,并且异常被正确抛出。还需要考虑事务的传播行为,如果方法内部有嵌套事务,可能会影响回滚的范围。不过用户的问题看起来是一个简单的事务,没有嵌套的情况。根据引用2中的例子,内部方法如果有保存点,回滚可能只影响部分操作,但这里的情况不同,因为文件操作不在事务管理内,所以主要看数据库操作是否在同一个事务里。总结一下,用户需要确保以下几点:1.文件读取失败抛出RuntimeException或配置rollbackFor;2.文件操作数据库操作在同一个事务方法内;3.事务的传播设置正确。这样,当文件读取失败数据库删除操作会被回滚。</think>在Spring Boot应用中,事务管理默认只对数据库操作有效,文件系统操作不在事务控制范围内。但通过合理设计,可以实现数据库删除操作与文件读取的原子性。以下是关键分析步骤: ### 一、事务边界与回滚机制 1. **Spring事务管理范围** 默认仅管理数据库事务(如JDBC、JPA操作),通过`@Transactional`注解的代理机制实现。当方法抛出**RuntimeException**或**Error**事务会自动回滚数据库操作[^3] 2. **文件操作特性** 读取外部文件属于I/O操作,不参与数据库事务。若文件读取失败,需要通过异常处理机制触发事务回滚 $$ \text{事务完整性} = \begin{cases} \text{数据库操作回滚} & \text{当异常满足回滚规则} \\ \text{文件状态保持} & \text{需额外补偿机制} \end{cases} $$ ### 二、实现方案 ```java @Transactional(rollbackFor = IOException.class) // 扩展回滚规则 public void transactionalOperation() throws IOException { // 数据库操作 jdbcTemplate.update("DELETE FROM table WHERE condition"); // 文件操作(需主动抛出受检异常) Files.readAllBytes(Paths.get("external_file.txt")); } ``` ### 三、异常处理策略 | 操作类型 | 回滚触发条件 | 补偿机制 | |----------------|----------------------------------|------------------------------| | 数据库删除 | 抛出RuntimeException/指定异常 | 事务自动回滚 | | 文件读取 | 需将IOException转为RuntimeException | 手动删除已读取文件或日志记录 | ### 四、验证测试要点 1. 构造文件读取失败场景,观察数据库操作是否回滚 2. 验证`@Transactional(rollbackFor)`配置是否生效 3. 检查事务隔离级别是否符合业务需求(参考脏读/不可重复读控制[^1]) ### 五、扩展方案 对于需要严格保证原子性的场景,建议: 1. 采用分布式事务管理器(如Atomikos) 2. 将文件操作记录写入数据库,通过事务日志实现补偿 3. 使用最终一致性模式(异步文件状态校验)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值