测试PG中事务隔离级别

我们知道事务隔离级别有:读未提交,读已提交,可重复读,可序列化。

读未提交 存在 脏读,不可重复读,幻读;

读已提交 存在 不可重复读,幻读

可重复读 存在 幻读

PG 下默认为读已提交,ORACLE默认也是读已经提交,一般很少有人去关注过这个,但在pg,mysql,对这个比较热衷。

先来看看概念:

        脏读:是指在一个事务处理过程里读取了另一个未提交的事务中的数据。 当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。

        不可重复读:是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。 例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。 不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

      幻读: 是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

我们来准备一个数据张表:

   create table tt(id int);

    当前事务隔离情况:

     

   要修改隔离级别,可以使用 

    

先来测试 读提交 

        1.先进入事务T1 ,T2,两边记录都一样

      2.事务T1插入数据,但不提交,事务T2 看不到

      3.事务T1提交,事务T2,已经能看到

   
 

测试可重复读:

     1.设置隔离级别为可重复读

     

 2. 会话1插入数据,并提交,但会话二不能看到会话一已经提交的数据

        

好了,测试做到这里。

为了方便交流,我建立了一个微信群:水煮数据库,主要交流日常运维中用到的数据库相关问题,包含但不限于:ORACLE,PG,MYSQL,SQLSERVER,OB,TIDB,达梦,TDSQL,OPENGAUSS,人大金仓,GBASE等等,如果有兴趣交流,可以加我微信:zq24803366, 我可以拉你入群。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/cqsztech/article/details/138414459

<think>嗯,用户想知道如何使用DataGrip将PostgreSQL的数据迁移到MySQL。首先,我需要回忆一下DataGrip的功能,它确实支持跨数据库的数据迁移吗?记得DataGrip有导出和导入数据的功能,可能涉及到导出为SQL脚本或者CSV,然后再导入到另一个数据库。不过不同数据库之间的数据类型可能有差异,比如PostgreSQL的数组类型在MySQL里可能需要转换。另外,用户可能还需要迁移表结构,而不仅仅是数据,这时候可能需要用到DDL导出,然后手动调整语法差异。 然后,用户提供的引用里提到了Oracle到MySQL或PostgreSQL的迁移,特别是语法转换工具比如Ora2pg。但DataGrip是否有类似的功能呢?可能需要手动处理一些转换,或者使用第三方工具辅助。比如,导出表结构的时候,需要检查自增主键、索引、约束等是否兼容。比如PostgreSQL使用SERIAL,而MySQL使用AUTO_INCREMENT,这需要修改建表语句。 数据迁移部分,DataGrip的导出数据功能可以生成INSERT语句,但如果有大量数据,可能更高效的方式是导出为CSV,然后用LOAD DATA导入MySQL。不过要注意CSV的格式,比如引号、分隔符、换行符等。同时,注意字符编码问题,确保两边数据库的编码一致,比如UTF-8。 存储过程、触发器等对象可能需要重写,因为语法差异较大。这时候用户可能需要手动调整或者寻找转换工具。比如引用4提到的Ora2pg,但那是针对Oracle到PostgreSQL的,是否有类似的工具用于PostgreSQL到MySQL呢?或者DataGrip有没有插件支持? 另外,用户可能还需要测试迁移后的应用是否正常,检查是否有SQL语句不兼容,比如分页查询PostgreSQL用LIMIT和OFFSET,而MySQL用LIMIT,这点可能没问题,但其他函数如日期处理可能有差异。比如PostgreSQL的CURRENT_DATE和MySQL的一样,但某些函数如字符串处理函数可能需要调整。 总结步骤应该是:准备环境,导出结构,调整结构,导出数据,导入数据,验证数据,处理其他对象,最后测试应用。其中DataGrip可以用来导出结构和数据,但转换工作需要手动或借助其他工具。同时要注意事务和性能,比如在导入大量数据时分批处理,关闭索引等优化手段。</think>### 使用DataGrip从PostgreSQL迁移到MySQL操作指南 #### 一、准备工作 1. **安装DataGrip** 确保已安装最新版DataGrip,并配置好PostgreSQL和MySQL的数据库连接[^2][^4]。 2. **备份数据** 迁移前需备份PostgreSQL源数据库和MySQL目标数据库,避免数据丢失[^1]。 3. **环境检查** - 检查PostgreSQL和MySQL的版本兼容性。 - 确认目标MySQL数据库的存储引擎(如InnoDB)、字符集(如UTF-8)等配置[^3]。 --- #### 二、表结构迁移 1. **导出PostgreSQL表结构** - 在DataGrip中右键选择PostgreSQL表 → **Scripted Extensions** → **Generate DDL to Clipboard**。 - 手动调整语法差异: - 自增字段:将PostgreSQL的`SERIAL`改为MySQL的`AUTO_INCREMENT`。 - 数据类型转换:例如`BYTEA`→`BLOB`、`TEXT`类型直接兼容。 - 移除`::regclass`等PostgreSQL特有语法[^4]。 2. **在MySQL中执行DDL** 将修改后的建表语句粘贴到MySQL的SQL控制台并执行。 --- #### 三、数据迁移 1. **导出数据为CSV或SQL脚本** - 在DataGrip中选择PostgreSQL表 → **Export Data to File** → 选择CSV或SQL格式。 - 若导出为SQL,需检查`INSERT`语句是否兼容(如时间格式`NOW()`需改为`CURRENT_TIMESTAMP`)。 2. **导入数据到MySQL** - **CSV导入**: 使用MySQL的`LOAD DATA INFILE`命令或DataGrip的**Import from File**功能。 ```sql LOAD DATA INFILE '/path/data.csv' INTO TABLE table_name FIELDS TERMINATED BY ','; ``` - **SQL脚本导入**: 直接通过DataGrip的SQL控制台运行脚本。 --- #### 四、对象迁移(可选) 1. **视图与存储过程** 需手动重写,因语法差异较大。例如: - PostgreSQL的`$$`语法块需改为MySQL的`BEGIN...END`。 - 函数如`STRING_AGG()`需替换为`GROUP_CONCAT()`[^3]。 2. **索引与约束** 检查并调整索引类型(如PostgreSQL的GIN索引需改为MySQL的FULLTEXT索引)。 --- #### 五、验证与优化 1. **数据一致性检查** - 使用`SELECT COUNT(*)`对比行数。 - 抽样验证字段值是否正确(如日期、二进制数据)。 2. **性能优化** - 在MySQL中为常用查询字段添加索引。 - 调整事务提交频率(批量插入时建议关闭自动提交)。 --- #### 六、注意事项 1. **字符编码问题** 确保MySQL的`character_set_database`和PostgreSQL的`ENCODING`均为`UTF8`。 2. **保留字冲突** 如PostgreSQL表名含MySQL保留字(如`USER`),需在MySQL中用反引号转义:`` `USER` ``。 3. **事务隔离级别** 迁移过程中设置合适的隔离级别(如`READ COMMITTED`)避免锁表。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值