详解:PostgresqlOracleMySQL的ACID差异

news/2024/7/9 22:35:05 标签: postgresql, oracle, mysql, 事务

1.--ACID是什么?
==事务的属性:
原子性: 一个事务的所有部分必须都完成,或者都不完成。
一致性: 查询的结果必须与数据库在查询开始时的状态一致。
隔离性: 除了作出变更的会话,其他会话都无法看到未提交的数据。
持久性: 事务一旦完成,不可丢失。


=========================================================================
2.--oracle的ACID实现
==默认隔离级别为 read_commited

属性        实现方式
原子性    undo
一致性    SCN
隔离性    UNDO
持久性    REDO/UNDO LGWR

>>>>oracle中DDL会导致事务的自动提交。


=========================================================================
3.--mysql的ACID实现
==默认隔离级别为 read_repeatable

属性        实现方式
原子性    REDO
一致性    UNDO
隔离性    锁+MVCC
持久性    REDO

1.innoDB才有redolog。
2.事务提交后binlog一次性写入,redolog在事务进行中持续写入,默认是事务提交时刷盘,保证原子性和持久性(innodb_flush_log_at_trx_commit可改)。
3.写操作隔离用锁实现。
1).锁的分类按照功能:
读锁(共享锁),写锁(排他锁);
2).按照范围:表级,行级;
3).意向锁(表级),间隙锁(防止幻读,保证一个事务中两次查询获得的数据一致)。

4.读和写的隔离,用MVCC实现(靠每行上的隐藏列和undo实现)。
1).快照读,历史记录从undo中获取。
2).当前读,insert、update、delete获取的是最新版本数据。


=========================================================================
4.--postgresql的ACID实现
==默认隔离级别为 read_commited。

属性        实现方式
原子性    MVCC
一致性    约束/RD隔离级别
隔离性    MVCC
持久性    WAL

--MVCC实现原理
1).数据文件中存放同一逻辑行的多个行版本(称为Tuple)。
2).每个行版本的头部记录创建以及删除该行版本的事务的ID(分别称为xmin和xmax)。
3).每个事务的状态(运行中,中止或提交)记录在pg_clog文件中。
4).根据上面的数据并运用一定的规则每个事务只会看到一个特定的行版本。

>>>>通过MVCC读写事务可以分别在不同的行版本上工作,因此能够在互不冲突的情况下并发执行。


=========================================================================
5.--隔离级别测试不可重复读


=========================================================================
5.1--PG默认隔离级别为RD
session1开一个事务,session2 update并提交,session1在事务里能查到session2提交的数据:


--session1

postgres=# begin ;
BEGIN
postgres=# select * from dy2;
 id | name 
----+------
  2 | b
  3 | c
  5 | c
  1 | f
(4 rows)


--session2

postgres=# begin ;
BEGIN
postgres=# select * from dy2;
 id | name 
----+------
  2 | b
  3 | c
  5 | c
  1 | f
(4 rows)

postgres=# update dy2 set id =10 where name ='b'
postgres-# ;
UPDATE 1
postgres=# select * from dy2;
 id | name 
----+------
  3 | c
  5 | c
  1 | f
 10 | b
(4 rows)

postgres=# commit;
COMMIT


--session1

postgres=# select * from dy2;
 id | name 
----+------
  3 | c
  5 | c
  1 | f
 10 | b
(4 rows)

=========================================================================
5.2--MYSQL默认隔离级别RR
session2修改的数据,session1在事务里是看不到的,除非退出事务后,才能看到session2提交的数据。


--session1

mysql> show variables like 'transaction_isolation'
    -> ;
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from dy_test1;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
3 rows in set (0.00 sec)


--session2

mysql> update dy_test1 set id =10 where name ='a';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from dy_test1;
+------+------+
| id   | name |
+------+------+
|   10 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
3 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)


--session1

mysql> select * from dy_test1;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
3 rows in set (0.01 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from dy_test1;
+------+------+
| id   | name |
+------+------+
|   10 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
3 rows in set (0.00 sec)


=========================================================================
5.3--ORACLE默认隔离级别RC
同上PG测试的一样,session2 update并提交,session1在事务里能查到session2提交的数据。
如果为serializable,session1始终看到的最初的记录。


=========================================================================
6.--关于事务隔离级别
oracle 支持read_commit,serializable。
mysql 支持repeatable read,read_commit,serializable,read_uncommit。
PG 支持read_commit,repeatable read,serializable,read_uncommit。


=========================================================================
7.--异常现象
幻读——事务A读到了事务B提交的数据(mysql使用间隙锁解决)(做了insert)。
脏读——读取到另一个事务未提交的数据。
不可重复读——在同一个事务中,前后两次读取的数据不一致(做了update)。


http://www.niftyadmin.cn/n/5405312.html

相关文章

UE 打包窗口及鼠标状态设置

UE 打包窗口及鼠标状态设置 打包后鼠标不锁定 显示鼠标图标 打包后设置窗口模式 找到打包路径下的配置文件GameUserSettings,设置相关项目 FullscreenMode0表示全屏模式,1表示窗口全屏模式,2表示窗口模式

【NR 定位】3GPP NR Positioning 5G定位标准解读(六)

前言 3GPP NR Positioning 5G定位标准:3GPP TS 38.305 V18 3GPP 标准网址:Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读(一)-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读(…

记录踩过的坑-macOS下使用VS Code

目录 切换主题 安装插件 搭建Python开发环境 装Python插件 配置解释器 打开项目 打开终端 切换主题 安装插件 方法1 方法2 搭建Python开发环境 装Python插件 配置解释器 假设解释器已经通过Anaconda建好,只需要在VS Code中关联。 打开项目 打开终端

【Android12】Android性能调优工具SystemServerTiming日志

Android性能调优工具SystemServerTiming日志 性能优化、稳定性优化是Android系统优化的两大方面,对于性能调试Android提供了很多工具,比如:bootchart、systrace、perfboot、log、dmsg等等。 SystemServerTiming是Android原生系统中一个日志…

Leetcode 3072. Distribute Elements Into Two Arrays II

Leetcode 3072. Distribute Elements Into Two Arrays II 1. 解题思路2. 代码实现 题目链接:3072. Distribute Elements Into Two Arrays II 1. 解题思路 这一题不太明白为啥被划分为了hard的题目,我们只需要按照题意构造一下arr1和arr2即可&#xff…

「优选算法刷题」:最长回文子串

一、题目 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba"…

单词级文本攻击—论文阅读

TAAD2.2论文概览 0.前言1-101.Bridge the Gap Between CV and NLP! A Gradient-based Textual Adversarial Attack Frameworka. 背景b. 方法c. 结果d. 论文及代码 2.TextHacker: Learning based Hybrid Local Search Algorithm for Text Hard-label Adversarial Attacka. 背景b…

jmeter快速使用

文章目录 前言一、安装jmeter二、插件安装三、添加常用监听器参考 前言 Apache JMeter may be used to test performance both on static and dynamic resources, Web dynamic applications. It can be used to simulate a heavy load on a server, group of servers, network…