首页
学习
活动
专区
圈层
工具
发布

mysql中的read only

基础概念

MySQL中的READ ONLY是一种事务隔离级别,它表示当前事务只能读取数据,而不能对数据进行修改(如插入、更新、删除)。这种隔离级别主要用于防止脏读(读取到其他事务未提交的数据)和不可重复读(读取到其他事务已提交的数据)。

相关优势

  1. 数据一致性:READ ONLY事务可以确保读取到的数据是一致的,不会受到其他事务的影响。
  2. 并发控制:通过设置READ ONLY,可以有效控制并发事务之间的冲突,提高系统的并发性能。
  3. 安全性:在某些场景下,如数据分析、报表生成等,只需要读取数据而不需要修改数据,设置READ ONLY可以提高数据的安全性。

类型

MySQL中的隔离级别主要有四种:

  1. READ UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  2. READ COMMITTED:允许读取并发事务已经提交的数据,可以防止脏读,但幻读和不可重复读仍可能发生。
  3. REPEATABLE READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以防止脏读和不可重复读,但幻读仍可能发生。
  4. SERIALIZABLE:最高的隔离级别,完全服从ACID的隔离级别,确保事务串行执行,防止脏读、不可重复读以及幻读。

应用场景

  1. 数据备份与恢复:在进行数据备份时,可以将数据库设置为READ ONLY,以确保备份过程中数据不会被修改。
  2. 数据分析与报表:在进行数据分析和生成报表时,通常只需要读取数据而不需要修改数据,设置READ ONLY可以提高性能和安全性。
  3. 高并发读取场景:在高并发读取数据的场景下,设置READ ONLY可以减少事务之间的冲突,提高系统的并发性能。

遇到的问题及解决方法

问题:为什么在设置为READ ONLY的事务中仍然可以执行某些修改操作?

原因:虽然事务被设置为READ ONLY,但某些系统函数或存储过程可能会绕过这个限制,执行修改操作。

解决方法:

  1. 检查系统函数和存储过程:确保所有系统函数和存储过程在READ ONLY事务中不会执行修改操作。
  2. 使用LOCK TABLES:在执行修改操作前,使用LOCK TABLES语句锁定表,确保在修改期间其他事务无法读取或修改数据。
代码语言:txt
复制
START TRANSACTION READ ONLY;
-- 执行读取操作
COMMIT;

参考链接

MySQL事务隔离级别

通过以上解释,希望你对MySQL中的READ ONLY有了更深入的了解。如果有其他问题,请随时提问。

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

相关·内容

read_only和super_read_only参数的区别

在MySQL中,从库经常会被设置成为read_only属性,来防止数据的写入,在开启gtid的情况下,如果我们看到从库上面有多个GTID值,然后其中一个GTID的uuid和从库的uuid一致,那就可以判断...: a、从库复制中的更新,也就是说在主从复制场景下,从库设置read_only是有效的,复制不会因此中断。...option so it cannot execute this statement Innodb_Read_Only参数(有点类似super_read_only) 在MySQL中,除了super_read_only...和read_only之外,还有一个参数innodb_read_only,这个参数设置为on之后,在MySQL5.7版本中,仅仅会阻止innodb存储引擎的表创建和删除,在MySQL8.0中,会阻止所有存储引擎执行...create和drop表的操作,除此之外,启用了innodb_read_only参数,analyze table可能会失败,因为该操作本质上需要更新innodb数据字典中的统计表。

5.3K50
  • MySQL之如何消除大量的@@session.tx_read_only

    1.发现大量的"select @@session.tx_read_only"     当有好多个线程(我测试时是300个线程)去对数据库进行操作时,用如下命令查看 List-1 show processlist...;     得到的结果如下图1,会发现有大量的"select @@session.tx_read_only",占了很大一部分,我们是否可以消除它呢?...,所以发送"select @@session.tx_read_only"给MySQL,所以我们在show processlist时才看到大量的"select @@session.tx_read_only...3.出于提升性能的考虑,怎么消除这么多的"select @@session.tx_read_only"呢     最简单的方法是在JDBC url上面加上: List-2 &useLocalSessionState...=true     加上List-2之后,再去show processlist;查看下,会发现之前出现的大量的"select @@session.tx_read_only"消失不见了。

    5.6K40

    Mysql的read_only 只读属性说明 (运维笔记)

    在MySQL数据库中,在进行数据迁移和从库只读状态设置时,都会涉及到只读状态和Master-Slave主从关系设置, 以下针对real_only只读属性做些笔记记录: 1) 对于MySQL单实例数据库和...> set global read_only=0; 对于Mysql数据库读写状态,主要靠"read_only"全局参数来设定;默认情况下, 数据库是用于读写操作的,所以read_only参数也是0或faluse...1) read_only=1只读模式,不会影响slave同步复制的功能,所以在MySQL slave库中设定了read_only=1后,通过 "show slave status\G" 命令查看salve...状态,可以看到salve仍然会读取master上的日志,并且在slave库中应用日志,保证主从数据库同步一致; 2) read_only=1只读模式,可以限定普通用户进行数据修改的操作,但不会限定具有super...权限的用户的数据修改操作;在MySQL中设置read_only=1后,普通的应用用户进行insert、update、delete等会产生数据变化的DML操作时,都会报出数据库处于只读模式不能发生数据变化的错误

    5.4K20

    集群存在read only表

    system.replicas) WHERE is_readonly settings max_memory_usage=225829120 【可能风险】 所有标记为is_readonly=1的表拒绝写入...延迟大 副本表在 ZooKeeper 中的元数据丢失 【建议】 磁盘满 删除部分数据,如通过alter方式删除表分区 ALTER TABLE problematic_table DROP PARTITION...但该方法可能耗时长,重启时长与版本及集群数据量有关 system reconnect keeper 高版本可以执行该条命令 在控制台调整metrical.xml配置,将watch个数少的zk节点放在前面...,会触发重连 4. replication_queue的fetch延迟大 见存在同步延迟超10min的副本 5....副本表在 ZooKeeper 中的元数据丢失,执行下列命令恢复 SYSTEM RESTART REPLICA [ON CLUSTER cluster_name] [db.]replicated_merge_tree_family_table_name

    61400

    Anaconda base enviroment read only 解决

    Anaconda base enviroment read only 解决 下载安装完anaconda后首先手动设置环境变量—>系统信息—>高级系统设置 设置—>系统—>高级系统设置—>环境变量—>系统变量...—>选择path的,单击然后编辑 在里面添加(本人是下载到D:\soft\Anaconda3文件夹,大家对照自己的路径来设置) D:\soft\Anaconda3 D:\soft\Anaconda3\Scripts...\Anaconda3\Library\mingw-w64\bin D:\soft\Anaconda3\condabin 设置好后win+r弹窗输入cmd,回车后输入conda info 在这里,它显示的是...read only,我们要把它调成writable 解决措施: 找到下载的文件目录,比如我下载到的是D盘的anaconda,则单击anaconda文件夹,右键选择属性,在上面一小排选项中选中安全 选中...确保以下路径存在 E:\14anaconda E:\14anaconda\Scripts E:\14anaconda\condabin 第3部分:如果上述方法无效 管理员方法打开cmd或者你正在运行的编程程序

    95200

    MYSQL super_read_only 到底有没有必要存在

    MYSQL系统的参数 read_only 是一个普通的控制数据库登录的普通用户对于数据库的数据的操作控制的权限。...在percona 的版本中在MYSQL 5.6.21中他们添加了一个参数 super_read_only,官方的版本在 5.7.8后添加了这个功能。...0.58的模式中则更换成super_read_only ,那这又怎么样。...目前采用的流行的中间件产品,proxysql 对于MHA 类型的主库判断是基于read_only 来判断到底这个数据库中,那台是主库,那台是从库,并且依据read_only 来进行读写分离,以及切换数据的路由...所以这个super_read_only的使用,还是要看你的所使用的中间件产品以及MHA的版本,来部分决定super_read_only到底是不是适合在你的mysql高可用的架构中使用。

    1.2K10

    MySQL出现Table‘xxx’is read only问题解决方案

    今天在我把一个视频网站的数据库,复制到另一个服务器上的时候遇到了这样的问题, 后台登录登不进去,就显示数据加载中,然后没反应了,前台数据不更新不准确, 然后我通过phpmyadmin进入数据库里,对mysql...数据库的表进行检查发现, 出现了Table‘xxx’is read only的问题, 第一反应,就是777权限不对,马上设置了777, 之后再检查,仍然是Table is read only!...whereis mysql 查出来几个目录,居然也没有bin目录! 于是,放弃了,再找几个方案试试!...真的又看到一个,说要在宝塔界面操作的 也同样有一个命令 mysqladmin -p flush-tables 我就抱着试试看的心态,直接在ssh连输入了上面的命令!...在此做个记录,解决了MySQL出现Table‘xxx’is read only的问题!

    2.7K20

    Uncaught TypeError: Cannot assign to read only property exports of object

    今天在进行vue服务端渲染的时候,出现如下错误 Uncaught TypeError: Cannot assign to read only property 'exports' of object '...#' 查了资料 “在webpack打包的时候,可以在js文件中混用require和export。...但是不能混用import 以及module.exports ” 但是项目并没有混用 import 与 module.exports 经过调试发现 是下面代码的问题 let {...rest} = {name...去掉上面代码就没有问题了 但是这不是解决办法,这个模块是作为一个公共模块使用,客户端和服务端都要用到这个模块,但是客户端渲染没有问题,因此考虑在服务端运行时的问题,node本身是支持es6的新语法的因此修改....babelrc文件 原来的配置 "presets":[ "@babel/preset-env" ] 修改后的配置 "env": { "browser": {

    1.3K10

    笔记 | Ubuntu下NTFS分区read-only状态清除修复

    问题描述 Ubuntu 20.04的物理系统下,我的一个NTFS分区可能由于在Windows更新时进行了强制关机出现了错误,因此在Ubuntu下无法正常写入,出现了read-only状态。...问题解决 查找了一些修复方法,有针对ext2/ext3/ext4和NTFS两种文件系统的修复方法。...我在这里找到了针对NTFS的修复指令: 假设需要修复的分区挂载在/dev/sdb1 首先在文件管理器或使用命令解除分区挂载 sudo umount /dev/sdb1 然后使用ntfsfix命令尝试修复...如果你的受损分区是EXT4的,还可以参照这里进行修复: 假设需要修复的分区挂载在/dev/sdb1 首先在文件管理器或使用命令解除分区挂载 sudo umount /dev/sdb1 然后使用fsck命令尝试修复...EXT4分区 sudo fsck.ext4 -y /dev/sdb1 修复时请选择对应的文件系统的修复指令。

    1.5K10
    领券