数据库对比系列之三PG事务与MySQL

今天网上有个帖子,说MySQL部分事务成功,部分事务失败。原图如下:

我第一感觉觉得不应该。我当时也觉得这个好像按照DBA的角度来说不应该一个成功一个失败。于是我做了一个模拟。下面有两个表一个是W表有主键,为了模拟冲突。另外一个B表无约束,随便操作。

开启事务,w有5条,b有2条。这个时候给b新增一条3,并且给w增加一条5(一定是冲突的)。数据库版本是MySQL8.0.26。

查看一下结果,真的是W没有进去,而B有数据了。好像世界观坍塌了。和我们之前预想的不一样。这个时候我们来看看其他数据库如何?

由于Oracle必须手工提交,所以很容易模拟。看下图b取前5条。C表建立约束,给C表先增加一条数据,准备制造冲突(绿色框)。

红色框为事务开始,给B增加一条数据,给C也增加一条数据。C写入失败。这个时候提交。结果是B的数据进来了,C没有成功。看了Oracle也是这样的机制。好了,静心下来想想,那这么说不是BUG了。因为Oracle不可能有这样的BUG。毕竟大家都觉得Oracle这个神谕,有点像神一样的存在。

来梳理一下为什么?假设开启事务以后,执行了SQL1,SQL2和SQL3.SQL1成功,这个时候SQL2由于拼写或者语法错误报错执行不成功。SQL3,继续执行成功。那么提交以后会如何?这么想的话(应用程序不会犯这个错误,因为都是编译测试过的,但是人工会这样的),的确应该SQL1和SQL3成功SQL2,拼写错了,不成功也合理。这么一想,我好像也想通了。也合理了。

那么我们来看看PG的执行。B表和C表的区别是C表的ID是主键不能冲突的。B表一条记录,C表一条记录。

红框为事务。篮框是提交,注意与其他数据库不一样的是。由于事务之间有报错,所以这个提交后,PG最终给出的不是


转载请注明:http://www.aierlanlan.com/rzdk/435.html

  • 上一篇文章:
  •   
  • 下一篇文章: