在官方的描述与示例中,我没有看明白语句级原子性和事物级原子性是怎么区分的,个人感觉冲突呢,还请各位大佬指点
语句及事物一致性
事物级一致性
这俩个概念不冲突吧,说的不是一个东西
BEGIN;
UPDATE t SET val = 1 WHERE id = 1; – 成功
UPDATE t SET val = 2 WHERE id = 999; – 失败(如无此记录或违反约束)→ 语句级回滚
– 此时第一条 UPDATE 的修改仍存在(在事务内可见)
ROLLBACK; – 事务级回滚 → 第一条 UPDATE 的修改也被撤销
2.按照事物级的原子性应该都被回滚才对啊。 感觉在语句中间中间标记了一个 保存点 “”savepoint“”。如果有保存点的话也能明白。但是在这个事务中没有看到标记保存点。
意思是update执行成功,更新结果被提交,这个被提交是没有持久化,整体事物还需要去遵循事物的acid。
语句级:事务内的某个语句的成功与否不影响别的语句
事务内部的语句会影响到其他事务的语句吗,应该有个隔离性
在上述的整个事物中,说的执行成功,其更新结果被提交是指这条语句在这个事物内部执行成功&提交成功。并不是事物整体的acid的成功。
颗粒度不一样而已
在您的问题中,您提到了对语句级原子性和事务级原子性的疑惑。这两个概念确实容易混淆,但它们在数据库事务处理中有明确的定义和区别。
事务级原子性是指一个事务中的所有操作要么全部成功,要么全部失败。如果事务中的任何一个操作失败,那么整个事务将被回滚,所有的更改都将被撤销。这种机制确保了数据的一致性和完整性。例如,在一个转账交易中,从账户A转100元到账户B的操作必须保证两个账户的修改要么都成功,要么都不成功,不能出现只扣款而未到账的情况。
语句级原子性是指单个SQL语句的操作作为一个整体执行。如果某个SQL语句包含多个子操作(如更新多行),这些子操作要么全部成功,要么全部失败。然而,这并不意味着整个事务会因为一条语句的成功或失败而提前提交或回滚。
在您提供的示例中:
这里的关键在于理解**“其更新结果被提交”**的意思。在这个上下文中,它指的是该UPDATE语句在事务内部执行成功,并且其效果对后续的语句是可见的。但这并不意味着这个更改已经持久化到数据库中。整个事务只有在COMMIT时才会真正提交并持久化所有的更改。
因此,尽管UPDATE语句执行成功并且其效果在事务内部是可见的,但当INSERT语句失败时,整个事务最终会回滚,所有更改(包括UPDATE的结果)都会被撤销。
您提到的保存点是一种在事务中设置的标记,允许部分回滚事务。在您的示例中没有使用保存点,所以整个事务在遇到错误时会被完全回滚。
UPDATE语句在事务内部执行成功,但整个事务由于INSERT语句的失败而回滚,所有更改(包括UPDATE的结果)都不会持久化。希望这能帮助您更好地理解语句级原子性和事务级原子性的区别。如果您还有其他疑问,请随时提问。
详情请参考:
支持。
了解了解
是的,应该是这个意思
一个语句是一条sql,一个事务可能有多个sql
666
内容详实,观点独到,值得一读。
感谢分享!