首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么引发ActiveRecord::Rollback不删除在另一个线程中创建的记录

ActiveRecord::Rollback是Rails中的一个异常类,当事务回滚时抛出。事务回滚可以由多种原因引发,包括数据库操作失败、验证失败或手动回滚等。

在Rails中,事务是用来确保数据库操作的一致性和完整性的机制。当一个事务中的任何一部分操作失败时,整个事务将被回滚,即所有已执行的操作都将被撤销。

在多线程环境中,如果在一个线程中创建了记录,并且在另一个线程中引发了ActiveRecord::Rollback异常,那么在引发异常的线程中创建的记录将不会被删除。这是因为每个线程都有自己的数据库连接和事务,它们之间是相互独立的。

当一个线程引发了ActiveRecord::Rollback异常时,它只会回滚当前线程的事务,并不会影响其他线程的事务。因此,在另一个线程中创建的记录将保留在数据库中,直到该线程的事务提交或回滚。

这种设计是为了确保数据的一致性和并发性。如果在一个线程中创建的记录在另一个线程中引发异常后立即被删除,可能会导致数据不一致或并发冲突的问题。

总结起来,引发ActiveRecord::Rollback异常不会删除在另一个线程中创建的记录,因为每个线程都有自己的事务和数据库连接,它们之间是相互独立的。这样设计是为了确保数据的一致性和并发性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SqlAlchemy 2.0 中文文档(二十二)

隐式方法访问 线程本地作用域 Web 应用程序中使用线程本地作用域 使用自定义创建作用域 上下文会话 API scoped_session ScopedRegistry...在为并发设计数据库应用程序时,适当模型是每个并发任务/线程都使用自己数据库事务。这就是为什么讨论数据库并发问题时,使用标准术语是多个并发事务。...(或类似) - 关于刷新失败时为什么必须调用 Session.rollback() 更多背景信息。...设计并发数据库应用程序时,适当模型是每个并发任务/线程都使用自己数据库事务。这就是为什么讨论数据库并发问题时,使用标准术语是多个并发事务。...在为并发设计数据库应用程序时,适当模型是每个并发任务/线程使用自己数据库事务。这就是为什么讨论数据库并发问题时,使用标准术语是多个并发事务。

2000

GenshinPlayerQuery_qeriuwjhrf

Passive MVC 模式,Model(模型)完全不知道自己身处于 MVC 结构之中。... QeePHP MVC 架构,出现了一系列对象。这些对象各自承担不同职责,从而实现了单一入口、请求调度等功能构成完整运行流程。...QContext QContext 封装了运行时上下文 QLog 类 QLog 实现了一个简单日志记录服务 包 – mvc QeePHP ,MVC 包实现了 MVC 模式。...QDB_Table QDB_Table 类(表数据入口)封装数据表 CRUD 操作 QDB_Table_Lite QDB_Table_Lite类 程序运行创建QDB_Table对象而不用事先创建类...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除

1.4K20

【MySQL】事务

s2,然后再插入一个数据,如下图: 然后我们另一个终端查看该表,是可以看见另一个终端插入数据: 上面所有的创建保存点、插入数据操作都是一个事务,那么我们操作失误了,想要撤回 Mike 数据,...但是我们将自动提交关闭,启动事务,像我们正常一样使用单 SQL 语句删除呢?再异常崩溃会怎样呢?下面我们验证一下: 如上,我们自动提交关闭后,执行单条 SQL 语句异常退出后,数据也会回滚回来!...读未提交 — RU 我们在上面也设置过了我们当前隔离级别是 RU,如下: 接下来我们开启两个事务并发起来,我们在其中一个事务插入数据、删除数据、修改数据等,还没有 commit 前,另一个事务中都可以查看得到...,如下: 这就是读未提交,我们另一个事务读到了别人还没提交事务!...一个事务执行,读到另一个执行事务更新(或其他操作)但是未 commit 数据,这种现象叫做脏读! 5.

8310

MySQL事务(脏读、不可重复读、幻读)

3.创建事务SQL语法 隐式事务:事务没有明显开启或者结束标志,mysql,默认是开启自动提交 SHOW @@autocommit;   所以针对SELECT、UPDATE、DELETE...| ROLLBACK]; #提交或者回滚   可以看出,事务未结束之前,操作是有效且更改了数据实体,那么试想一下,如果这是有多个事务参与, 肯定会出现各种各样数据统一情况,这就类似多个线程没有锁情况下修改同一个全局变量...SAVEPOINT a; # 设置回滚点,且变量名为a [DELETE | UPDATE | INSERT | SELECT]; #回滚时执行提交部分 ROLLBACK TO a; # 回滚时与...ROLLBACK TO搭配使用   可以发现在回滚点以前数据实体被删除、之后数据实体因为回滚而被撤销操作。...无法避免幻读(一个事务多次查询整表数据,由于其他事务新增(删除记录造成多次查询记录条数不同(一个事务读取到另一个事务已经提交数据)) SERIALIZABLE避免幻读情况,阻塞方式   可以看出

1.1K10

不起眼SQL导入,差点引发生产事故..

在数据库管理,SQL导入是一项常见却又潜在危险任务。这个不经意操作,也许一个不起眼SQL导入动作如何差点引发生产事故,以及我们可以从中学到教训。 1....执行批量导入之前,特别是可能修改或删除数据操作前,确保已经创建了全量备份。 最佳实践: 定期制定数据备份策略,确保备份是可用且完整。...最佳实践: 批量导入之前,应该删除DROP语句!! 如果可能,将DROP语句包装在事务,以便在执行时发生错误时可以回滚。 数据导入流程 为什么有一个清晰导入流程很重要?...truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment ,不能回滚,操作触发 trigger。...关于"水位值" "水位值" 可能指的是数据库中用于管理未提交事务日志信息,也称为 "水位线"。 DELETE 操作,由于是逐行操作并记录在事务日志,数据库会保留未提交事务信息,以支持回滚。

12710

MySQL并发控制:锁机制

当concurrent_insert设置为1时,如果MyISAM表没有空洞(即表中间没有被删除行),MyISAM允许一个线程读表同时,另一个线程从表尾插入记录。这也是MySQL默认设置。...4、当UPDATE修改聚簇索引时,将对受影响二级索引采用隐式锁,隐式锁是索引对二级索引记录逻辑加锁,实际上产生锁对象,不占用内存空间。...rollback引发Duplicate key死锁: 死锁产生原因是事务一插入记录时,对(2,2)记录加X锁,此时事务二和事务三插入数据时检测到了重复键错误,此时事务二和事务三要在这条索引记录上设置...程序以批量方式处理数据时候,如果事先对数据排序,保证每个线程按固定顺序来处理记录,也可以大大降低出现死锁可能。比如常见就是多线程下在程序lock锁住,进程下保持串行处理。...判断是否存在符合条件记录,如果没有,就插入记录,此时,只有一个线程能插入成功,另一个线程会出现锁等待, 当第1个线程提交后,第2个线程如因为主键值重复,会出现异常。

2K20

Data Access 之 MyBatis Plus(六)- ActiveRecord

一、ActiveRecord ActiveRecord 是 ORM 一种实现方式, Ruby 和 PHP 中使用较多,ActiveRecord 特点是模型类一个实例化对象对应数据库表一行记录...MyBatis Plus 框架也实现了 ActiveRecord。 使用 IDEA 创建一个新 Maven 项目 mybatis-plus-ar,相关依赖可以参考前面工程依赖。...二、ActiveRecord CRUD 操作 ActiveRecord 特点是模型类实例化对象对应表一行记录,所以 ActiveRecord 操作方式是通过实例化对象调用方法进行增删改查操作...+ insert); } 执行上述代码,输出结果如下: 查看数据库表记录 ActiveRecord 更新操作 TeslaTest 中新增 update 方法 @Test public void...+ delete); } 执行上述代码,输出结果如下: 要删除 id 也可以设置实例化对象

67810

SQLAlchemy session 使用问题

使用 create_engine 创建引擎时,如果默认指定连接池设置的话,一般情况下,SQLAlchemy 会使用一个 QueuePool 绑定在新创建引擎上。并附上合适连接池参数。...以默认方法 create_engine 时(如下),就会创建一个带连接池引擎。...个连接在使用过后,不放在 pool ,而是被真正关闭。...() raise finally: session.close() 是否线程安全 Session 不是为了线程安全而设计,因此确保只同一个线程中使用。...处理这种情况一种更常见方法是为每个并发线程维护一个 Session,而是将对象从一个 Session 复制到另一个 Session,通常使用 Session.merge() 方法将对象状态复制到本地新对象

5K50

【MySQL】MySQL事务

理解事务 事务操作 事务特性 事务隔离级别  事务隔离级别-操作  概念 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查 询、更新和删除数据。...MySQL事务(Transaction)是由存储引擎实现MySQL,只有InnoDB存储引擎才 支持事务。...Transaction 失败结束,将所有的DML语句操作历史记录全部清空 命 令:ROLLBACK 之前所有SQL操作其实也有事务,只是MySQL自动帮我们完成,每执行一条SQL时MySQL就...,则回滚事务 rollback; 事务特性 事务隔离级别  solate,顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?...如果一个事务正在操作数 据被另一个事务修改或删除了,最后执行结果可能无法达到预期。如果没有隔离性还会导致其他 问题。

3.5K20

年薪50万DBA必须了解MySQL锁和事务

行锁总是索引记录上面加锁,即使一张表没有设置任何索引,InnoDB 会创建一个隐藏聚簇索引,然后在这个索引上加上行锁。...参数 innodb_lock_wait_timeout 可以 MySQL 数据库运行时进行调整: 默认情况下 InnoDB 存储引擎不会回滚超时引发错误异常。...而真正删除这行记录删除操作其实被“延时”了,最终purge 操作完成。  purge 用于最终完成delete 和 update 操作。...如果当一个线程注册到一个空队列时,该线程就做为该队列 leader,后注册到该队列线程均为 follower,后续操作,都由 leader 控制队列 follower 行为。...注:任何参数都不要随意设置,看到别人设置参数能解决,为什么环境设置就报错了,看官方改参数注意事项,各种版本注意事项,去相应测试环境实验一下。

61810

MySQL(十三)之MySQL事务

比如说,员工管理系统删除一个员工,既需要删除员工基本资料,也要删除和该员工相关其他信息。这些数据库操作语句就构成一个事务。   ...MySQL只有使用了InnoDB数据库引擎数据库或者表才支持事务。   事务处理可以用来维护数据库完整性,保证成批 SQL 语句要么全部执行,要么全部执行。   ...4)SAVEPOINT identifiter     SAVEPOINT允许用户事务创建一个保存点,一个事务可以有很多个保存点。   ...2)Repeatable read (可重复读):可避免脏读、不可重复读发生。     解决了脏读,也保证了同一个事务多次读取同样记录结果是一致。...像Serializable这样级别,      就是以锁表方式(类似于Java多线程锁)使得其他线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。

85161

【MySQL高级】MySQL事务

MySQL事务(Transaction)是由存储引擎实现MySQL,只有InnoDB存储引擎才 支持事务。...事务处理可以用来维护数据库完整性,保证成批 SQL 语句要么全部执行,要么全部执行。...Transaction 失败结束,将所有的DML语句操作历史记录全部清空 命 令:ROLLBACK 之前所有SQL操作其实也有事务,只是MySQL自动帮我们完成,每执行一条SQL时MySQL就...,则回滚事务 rollback; 事务特性 事务隔离级别  Isolate,顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?...如果一个事务正在操作数 据被另一个事务修改或删除了,最后执行结果可能无法达到预期。如果没有隔离性还会导致其他 问题。

89820

MySQL临键锁探究

create index idx_num on t2(num); -- 创建唯一索引 create unique index idx_num on t2(num); -- 删除索引 drop index...rollback; rollback; 【案例测试-02-记录锁】 临键锁是间隙锁+记录;上述案例测试了临键锁间隙锁,这次我们来测试一下临键锁记录锁; session1 session2...这里需要牵扯到另一个问题了,InnoDB,相同普通索引叶子节点是以主键顺序进行排列,我们来模拟一下刚刚插入数据B+Tree上变化: 添加描述 只考虑叶子节点变化,可以看到上图在演变过程中产生了分裂情况...(假设每个叶子节点都只存储两个元素),如果普通索引重复值太多势必会造成大量分裂情况,减低插入效率,因此索引列不宜选择重复率太大列; 再看下图数据库表实际存储样子我们就会明白为什么num=20...(和普通索引效果一致); 创建唯一索引: -- 删除索引 drop index idx_num on t2; -- 创建唯一索引 create unique index idx_num on t2(num

9232

MySQL事务管理

如果设置保存点,直接进行rollback,那就是将从事务开始到目前所有操作全都回滚掉。 再commit结束掉,此时就属于正常sql了。...示例二: 如果我们不在事务中了,也就是执行begin,同样执行commit,就是纯粹SQL进行操作,删除id=2数据,会发现和预料到一样,右侧终端显示已经被删除: 但是当左侧直接将mysql...这就好比线程,对同一份资源做修改,另一个线程立马能看到,一定是因为没有加锁。所以对于读未提交来说,这个隔离级别几乎没有加锁,虽然效率高,但是存在很多问题。...此外,数据库表每条记录还有一个删除flag隐藏字段,用于表示该条记录是否被删除,便于进行数据回滚。 示例 创建一个学生表,表包含学生姓名和年龄。...删除记录并不是真的把数据删除了,而是先将该记录拷贝一份放入undo log,然后将该记录删除flag隐藏字段设置为1,这样回滚后该记录删除flag隐藏字段就又变回0了,相当于删除数据又恢复了。

24130

MySQL锁

读锁之间互斥,因此可以有多个线程可以对同一场表做增删改查 读写锁、写锁之间互斥,也就是说两个线程同时对一个表做字段变更,其中另一个要等到另一个线程执行完成才可以成功。 如何安全给表变更字段?...行锁就是对数据表记录加锁,比如事务A更新了一行,事务B也要更新同一行,则必须等事务A操作完成以后才能进行更新。 行锁什么时候加,什么时候释放?...InnoDB事务,行锁是需要时候添加,但是释放是事务结束时。 InndoDB行锁是通过锁索引记录实现,如果你update条件没有索引的话,那么将会对整张表进行加锁。 什么是死锁?...并发系统不同线程出现循环资源依赖,涉及线程等待别的线程释放资源,这几个线程之间就会形成死锁陷入无线等待。...死锁检测弊端: 每个新来线程如果发生阻塞,都需要判断是否因为自己加入引发死锁,检测死锁过程需要消耗CPU 其他解决死锁方案 确保业务无死锁,可以临时关闭死锁检测 在数据库服务端进行并发控制,对于相同行更新

1.5K10

MySQL七:一文详解六大日志

2.3 redo log效率为什么快 Redo Log 默认是事务提交时候将日志写入磁盘,为什么它比直接将 Buffer Pool修改数据写入磁盘要快呢?...3.4 Undo log工作原理 「undo log事务开启之前产生,当事务提交后,InnoDB会将事务对应undo日志保存在删除list,后台通过清除线程进行回收处理」。...「MySQL 5.5.7之后」 执行刷新日志操作时,错误日志「会关闭并重新打开」,如果错误日志不存在,则会先创建。...「MySQL正在运行状态下」 「在运行状态下删除错误日志后,不会自动创建错误日志,只有刷新日志时候才会创建一个新错误日志文件」。 五、查询日志 「查询日志分为一般查询日志和慢查询日志」。...file log_output={TABLE|FILE|NONE} 「TABLE:表示记录日志到表」 「FILE:表示记录日志到文件」 「NONE:表示记录日志」 5.1 一般查询日志(general

84840

mysql总览

,要么全部失败,一般就是通过commit和rollback来控制 一致性Consistency: 数据库总能从一个一致性状态转换到另一个一致性状态,比如小滴课堂下单支付成功后,开通视频播放权限...线程 数据写入后 记录变更到binlog 主库log dump线程和从库io线程交互 将binlog读取并写入到从库 relay log 再由sql线程读取日志 写到从库 你们搭建数据库主从复制目的有哪些...delete是删除数据 记录删除操作 方便回滚 释放空间 不会删除定义 truncate不会记录删除操作 释放空间 不会删除定义 drop 是删除整张表 mysql查询语句先后顺序说一说...隔离性是mvcc)) undo log 是记录事物变更前状态 用于快照恢复 出现错误 或者执行rollback 从undolog日志恢复(—涉及物理磁盘—) redo log 是记录变更后状态...多版本并发控制 如何实现: innoDB每一行数据添加了两个字段 data_transation_id data_rollback_ptr transation_id 每次处理一个书屋 加一

23420

mysql学习笔记(二)事务隔离

即一个事务用Where子句来检索一个表数据,另一个事务插入一条新记录,并且符合Where条件,这样,第一个事务用同一个where条件来检索数据后,就会多出一条记录造成了幻读。...根据可重复特性,这里使用可重复读作为隔离级别就非常合适。 四、事务隔离实现 mysql,每条更新操作同时都会记录一条回滚操作来方便我们rollback。...回滚语句 - rollback。 (2)set autocommit = 0,这个命令会将这个线程自动提交关掉。意味着如果你只执行一个select语句,事务就启动了,并且不会自动提交。...同一条记录在数据库中会有不同版本,实现方式通过read-view视图来实现,当每个事务启动会启动一个视图,每个视图都有一个版本id来区分。 (5)为什么使用长事务可能会拖垮整个库?...因为长事务连接这段时间,由于无法删除read-view日志,需要用该日志防备回滚,如果长事务越来越多了会导致占用内存越来越大,从而拖垮整个库。

51730

Mybatis-Plus插件扩展

batch # 批量操作打印重复问题请使用MybatisPlusLogFactory (3.2.1新增) # 该插件有性能损耗,建议生产环境使用。...Log 例外,可去掉结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. excludecategories=...} 由上图可看出,全表删除直接抛异常了,这种插件建议只开发环境中使用,生产环境不要用了。...2.4 乐观锁OptimisticLockerInnerInterceptor 当要更新一条记录时候,希望这条记录没有被别人更新 乐观锁实现方式: 取出记录时,获取当前version 更新时...version改为3再测试(也就是说两个人都想改同一条数据,但是其中一个人先该,另一个人后改,后改这个人version已经和数据库不一致了) @Test public void testOptimisticLocker

86020
领券