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

为什么Rails不将select查询包装到begin commit中

Rails不将select查询包装到begin commit中的原因是为了保持代码的简洁性和可读性。

在Rails中,begin commit块通常用于处理事务,用于保证一系列数据库操作的原子性,即要么全部成功,要么全部失败。而select查询通常是读取数据而不会修改数据,因此不需要放在事务中。

将select查询包装到begin commit中会增加代码的复杂性,使代码变得冗长且难以理解。同时,由于select查询不会对数据进行修改,也不会引发并发冲突的问题,因此不需要使用事务来保证数据的一致性。

另外,将select查询放在事务中还会增加数据库的负担,因为事务会对数据库加锁,导致其他操作需要等待。而对于只读的select查询,不需要使用事务可以提高数据库的并发性能。

总结起来,Rails不将select查询包装到begin commit中是为了保持代码的简洁性、可读性和性能的考虑。

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

相关·内容

Rails 从入门到完全放弃

前言 这是一篇关于Rails的开发经历的文章,旨在将Rails遇到的各种问题分享给还未接触Rails或是已经上路的朋友。虽说做Rails的开发时间不长,刚好一年多。...但是,在这一年的时间中,该使用的技术架构,Ruby-China 推荐的Gem,都尝试过使用过了,也为业务开发了一些Gem。...同时在开发过程Ruby-China社区也提供了许多帮助。类似查询 N + 1问题,CanCanCan权限问题….....只想告诉大家,Materia UI并不适合后台使用,而且与诸多的Gem存在兼容问题,Rails中大部分跟前端有关的Gem都是基于Bootstrap。...部署 其实Rails的应用部署相对比较容易,没有太多的内容。只要注意配置文件加后缀防止被新的commit覆盖就好了,一般来说,写好shell脚本实现一键部署也并非难事。

2.1K20

Oracle学习笔记四

一、PL/SQL编程 游标(光标Cursor) 为什么使用游标 ? 在写java程序中有集合的概念,那么在pl/sq也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据。...: open c1;(打开游标执行查询)   取一行游标的值: fetch c1 into job:(取一行到变量)   关闭游标: close c1;(关闭游标释放资源)   游标的结束方式: exit...declare   cursor pc is     select * from emp;   pemp emp%rowtype; begin   open pc;   loop     ...( ‘Kevin1’); commit; insert into user(name) values( ‘Kevin2’); commit; 五、Java程序调用存储过程 5.1 Java连接Oracle...的jar 在Java项目中导入连接Oracle数据库所需要的jar

1.3K31

day44_Oracle学习笔记_03

--> ACID   commit;   dbms_output.put_line('涨工资完成'); end; / 带参数的光标 示例代码如下: --查询某个部门的员工姓名 set serveroutput...--原则:一般情况下,我们不在存储过程和存储函数commit和rollback数据,应该交由调用者去做。    ...我们可以利用out参数,在存储过程和存储函数实现返回多个值。 这时存储函数的功能就被存储过程取代了,那为什么还要保留存储函数呢?答:为了版本的向下兼容。 什么时候使用存储过程/存储函数呢?...我们需要声明结构和创建体,其中体也是数据库的对象。 示例代码如下:     /*          1. 查询某个员工的所有信息 --> 问题:out参数太多         2. ...查询某个部门的所有员工信息 --> 问题:返回的是集合      */     // 在out参数中使用光标     // 查询某个部门中所有员工的所有信息     /*     --声明结构

1.7K31

oracle补充

索引 索引是若干数据行的关键字的列表,查询数据时,通过索引的关键字可以快速定位到要访问的记录所在的数据块,从而大大减少读取数据的I/O次数,因此可以显著的提高性能 创建索引的SQL 把下面表的name...视图优点 因为视图可以有选择性的选取数据库里的一部分,用户通过简单的查询可以从复杂查询得到结果,维护数据的独立性,视图可从多个表检索数据,对于相同的数据可产生不同的视图 创建视图的SQL create...3种事务的处理命令 commit命令:commit是事务的提交命令,数据库为了保证事务的唯一性,一致性,在内存中将为每一个客户建立工作区,客户机对数据库进行操作处理的事务都在工作区内完成,只有在输入commit...return yearsal; end; end; 调用PL/SQL --当调用的过程或是函数时,在过程和函数前需要带有select lv_package.lv_funyearsal(‘...定义游标 cursor 游标名 is select 语句; cursor是定义游标的关键词,select是建立游标的数据表查询命令 打开游标 open 游标名 ; 打开游标的过程有两个步骤: 1)将符合条件的记录送入内存

3.1K30

行锁:InnoDB 替代 MyISAM 的重要原因

执行 commit 后立马返回结果) 这里解释一下为什么要用 for update?...为什么不是只在满足条件的记录上加锁呢? 这是因为在 MySQL ,如果一个条件无法通过索引快速过滤,那么存储引擎层面就会将所有记录加锁后返回,然后由 server 层进行过滤。...索引的原理可以复习第 10 节 《为什么添加索引能提高查询速度》 为什么聚簇索引上的记录也要加锁呢?...所以在工作应该尽可能的让查询走索引。 本节讲解了 RC 隔离级别的锁实验,在下节会讲解 RR 隔离级别下的行锁情况,从而理解间隙锁的意义。...(5,5,3); commit; select * from t16 where c=3 for update;Result2 commit; Result1 和 Result 结果是相同的还是不同的

82820

For update介绍

commit; 行锁与表锁 只根据主键进行查询,并且查询到数据,主键字段产生行锁 begin; select * from goods where id = 1 for update; commit;...只根据主键进行查询,没有查询到数据,不产生锁 begin; select * from goods where id = 1 for update; commit; 根据主键、非主键含索引(name)...; commit; 根据主键、非主键含索引(name)进行查询,没有查询到数据,不产生锁 begin; select * from goods where id = 1 and name='prod12...,不产生锁 begin; select * from goods where name='prod11' for update; commit; 根据非主键不含索引(name)进行查询,并且查询到数据,...,并且查询到数据,主键字段产生表锁 begin; select * from goods where id 1 for update; commit; begin; select * from

1.4K31

数据库:MySQL select ... for update” 排他锁分析

for update仅适用于InnoDB,且必须在事务块(BEGIN/COMMIT)才能生效。...begin; select * from goods where id = 1 for update; commit; 2、只根据主键进行查询,没有查询到数据,不产生锁。...begin; select * from goods where name='prod11' for update; commit; 11、只根据主键进行查询查询条件为不等于,并且查询到数据,主键字段产生表锁...begin; select * from goods where id 1 for update; commit; 12、只根据主键进行查询查询条件为不等于,没有查询到数据,主键字段产生表锁。...begin; select * from goods where id 1 for update; commit; 13、只根据主键进行查询查询条件为 like,并且查询到数据,主键字段产生表锁

3.3K30

Golang如何优雅连接MYSQL数据库?

在Go访问DB需用sql.DB接口:可创建语句(statement)和事务(transaction),执行查询,获取结果。 使用DB时,除database/sql,还需引入想使用的特定DB驱动。...这个时候就可以使用 import _ 引用该。 上面的MySQL驱动引入的就是MySQL各个init()方法,你无法通过名来调用的其他函数。...导入时,驱动的初始化函数会调用sql.Register将自己注册在database/sql的全局变量sql.drivers,以便以后通过sql.Open访问。 ?...事务的使用 通过db.Begin()来开启一个事务,Begin方法会返回一个事务对象Tx。在结果变量Tx上调用Commit()或者Rollback()方法会提交或回滚变更,并关闭事务。...事务对象也可以准备(prepare)查询,由事务创建的准备语句会显式绑定到创建它的事务。 //开启事务 tx, err := DB.Begin() if err !

11.9K10

我想说:mysql 的 join 真的很弱

一、 问题提出: 《阿里巴巴JAVA开发手册》里面写超过三张表禁止join,这是为什么? 二、问题分析: 对这个结论,你是否有怀疑呢?...实验是为解决一个问题的:查询选修“tname553”老师所授课程的学生,成绩最高的学生姓名及其成绩 。...看步骤7.1,就是没有索引,join表很多的情况下,oracle仍然26秒查询出结果来。所以我会说mysql的join很弱。那么问题来了,为什么现在使用很多人使用mysql呢?...insert_sc_data(); commit; select insert_sc_data(); commit; create index idx_s_id on sc(s_id) ;...insert_teacher_data(); commit; select count(*) from teacher; 这个是oracle的测试和造数据脚本 create tablespace scott_data

43220

阿里不让 MySQL 多表 Join ?我偏要!

来源:http://rrd.me/ej57B 一、 问题提出:《阿里巴巴JAVA开发手册》里面写超过三张表禁止join,这是为什么? 二、问题分析:对这个结论,你是否有怀疑呢?...实验是为解决一个问题的:查询选修“tname553”老师所授课程的学生,成绩最高的学生姓名及其成绩 。...看步骤7.1,就是没有索引,join表很多的情况下,oracle仍然26秒查询出结果来。所以我会说mysql的join很弱。那么问题来了,为什么现在使用很多人使用mysql呢?...insert_sc_data(); commit; select insert_sc_data(); commit; create index idx_s_id on sc(s_id) ;...insert_teacher_data(); commit; select count(*) from teacher; ---- 这个是oracle的测试和造数据脚本 create tablespace

1.8K20

数据库:MySQL select ... for update” 排他锁分析

for update仅适用于InnoDB,且必须在事务块(BEGIN/COMMIT)才能生效。...begin; select * from goods where id = 1 for update; commit; 2、只根据主键进行查询,没有查询到数据,不产生锁。...begin; select * from goods where name='prod11' for update; commit; 11、只根据主键进行查询查询条件为不等于,并且查询到数据,主键字段产生表锁...begin; select * from goods where id 1 for update; commit; 12、只根据主键进行查询查询条件为不等于,没有查询到数据,主键字段产生表锁。...begin; select * from goods where id 1 for update; commit; 13、只根据主键进行查询查询条件为 like,并且查询到数据,主键字段产生表锁

1.7K40

浅析MySQL的锁机制

; Query OK, 0 rows affected Session1执行查询 mysql> select * from test_lock where id=1; +----+-----------...; Query OK, 0 rows affected Session1出现了不可重复读(NonRepeatable Read),也就是在查询的时候没有锁住相关的数据,导致出现了不可重复读,但是写入、...,所以mysql内部应该还有其他锁机制--MVCC机制; 5.悲观锁SQL使用 5.1共享锁使用(lock in share mode) Session1查询数据 mysql> begin; Query...read); 当前读和Gap锁 区别普通的select查询,当前读对应的sql包括: select ...for update, select ...lock in share mode, insert...+1 where id=1 and version=${version}; commit; 先查询后更新,需要保证原子性,要么使用悲观锁的方式,对整个事务加锁;要么使用乐观锁的方式,如果在读多写少的系统

74020

我想说:mysql 的 join 真的很弱

ITPUB博客 作者:e71hao blog.itpub.net/30393770/viewspace-2650450/ 一、 问题提出: 《阿里巴巴JAVA开发手册》里面写超过三张表禁止join,这是为什么...实验是为解决一个问题的:查询选修“tname553”老师所授课程的学生,成绩最高的学生姓名及其成绩 。...看步骤7.1,就是没有索引,join表很多的情况下,oracle仍然26秒查询出结果来。所以我会说mysql的join很弱。那么问题来了,为什么现在使用很多人使用mysql呢?...insert_sc_data(); commit; select insert_sc_data(); commit; create index idx_s_id on sc(s_id) ;...insert_teacher_data(); commit; select count(*) from teacher; 这个是oracle的测试和造数据脚本 create tablespace scott_data

41630

Go 语言操作 MySQL 之 SQLX

、 SQLX 库 sqlx是 Go 的软件,它在出色的内置database/sql软件的基础上提供了一组扩展。 该库兼容sql原生,同时又提供了更为强大的、优雅的查询、插入函数。...查询一行数据 查询一行数据使用sqlx库的Get函数实现: func (db *DB) Get(dest interface{}, query string, args ...interface{}...而查询多行数据则使用的是Select 函数: func (db *DB) Select(dest interface{}, query string, args ...interface{}) error...使用Select函数进行查询的时候,需要先声明一个结构体数组接收映射过来的数据: // 查询多行数据 func queryMultiRow() { sqlStr := "SELECT id, name...函数、Rollback函数及Commit函数实现事务操作: // 开启事务 func (db *DB) Begin() (*Tx, error) // 回滚事务 func (tx *Tx) Rollback

1.8K41

Mysql锁机制分析

; Query OK, 0 rows affected Session1执行查询 mysql> select * from test_lock where id=1; +----+-----------...;Query OK, 0 rows affected Session1出现了不可重复读(NonRepeatable Read),也就是在查询的时候没有锁住相关的数据,导致出现了不可重复读,但是写入、修改和删除数据还是加锁了...,所以mysql内部应该还有其他锁机制--MVCC机制; 5.悲观锁SQL使用 5.1共享锁使用(lock in share mode) Session1查询数据 mysql> begin;Query...read); 当前读和Gap锁 区别普通的select查询,当前读对应的sql包括: select ...for update,select ...lock in share mode,insert,...+1 where id=1 and version=${version};commit; 先查询后更新,需要保证原子性,要么使用悲观锁的方式,对整个事务加锁;要么使用乐观锁的方式,如果在读多写少的系统

1.9K40
领券