DBA1教材疑问

麻烦请教下,事务执行结果为什么是一半成功一半失败,事务的原子性不是全成功全失败吗?

6 个赞

这页是讲语句级的原子性,insert一条失败全部insert回滚,还不涉及事务

2 个赞

学习了

2 个赞

语句级原子性,非事务性原子性。

3 个赞

学习了

2 个赞

学习了

2 个赞

再麻烦请教下,图中的示例不应该是这样的吗:
事务执行过程:
BEGIN;
UPDATE T1 SET C1=1 WHERE C2=100; // 成功
INSERT INTO T1 SELECT * FROM T2; // 失败 → 触发回滚
COMMIT; // 未实际执行(因INSERT失败导致事务回滚)
执行结果:
UPDATE 成功:该语句内部的修改是原子的,要么全部执行成功(更新所有符合条件的行),要么全部失败。此处成功执行。
INSERT 失败:该语句内部的修改是原子的,要么全部插入成功,要么全部不插入。
事务整体回滚:由于INSERT失败,整个事务被回滚,因此所有操作(包括UPDATE的修改)都被撤销,数据库状态恢复到事务开始前的状态。
符合原子性:
语句级原子性:每个语句的修改是独立原子的(UPDATE成功或失败,INSERT成功或失败)。
事务级原子性:整个事务要么全部提交(所有操作生效),要么全部回滚(所有操作撤销)。此处因INSERT失败,事务回滚,符合事务级原子性。

而文档中事务的执行结果,update更新的结果为什么会被提交呢?不因该是回滚吗?
是语句的执行结果还是事务的执行结果?

3 个赞

学习了

2 个赞

我读到此处,也有相同的疑问! 感觉此处有问题。
begin; 开启事务,要么成功,要么失败,不会部分成功!实践测试也是全部失败!

4 个赞

其实我也觉得这里有些问题~ :sweat_smile:

就算什么也不做,数据库原生就应该保证语句级的原子性。

开启事务之后,就应该变成事务级的原子性了(autocommit = 1 在事务中就会自动失效了)~

2 个赞

这个测试您有疑问不 ???

2 个赞

懂了

2 个赞

我用mysql租户测试部分成功部分失败,是可以提交的,oracle租户提交后符合事务的原子性,要么全部成功要么全部失败。
对于mysql租户这种情况来说,数据库的事务原子性还有用吗?

例如,第5步执行失败,而事务还能正常提交,情况就变成了A用户减了钱B用户没有收到钱,那这样不就出现问题了吗?

那执行失败的SQL靠应用层来判断一个事务是否完整吗?

2 个赞

感觉版主 giant 说的这个预期就失败的 SQL(比如表不存在),应该就没有被算到事务里。

事务 commit 时可以保证能执行成功的 SQL 全都提交成功~

2 个赞

感觉教程里的示例意思是某一条 SQL 预期可能就是有问题的,比如表不存在……

不过教程里的这个例子和说法确实有点儿奇怪~

2 个赞

image

在O中,是具有事务的原子性的,在OB中O租户是一样的结果,Mysql租户一半成功一半失败 :rofl:

1 个赞

image

1 个赞

image

这一半成功一半失败,不理解 :face_with_diagonal_mouth:

1 个赞

最后:
在ORACLE租户模式中,已测试事务的原子性生效,要么全成功要么全失败。
在mysql租户模式中,一半成功一半失败。也就是文档中的示例。就是不知道为什么还能这样

1 个赞

盯一下

1 个赞