事务隔离和并发
Transaction isolation and concurrency
我正在尝试使用 Connector/J 和 MySql 在 Java(JDK1.8) 中构建应用程序。听说Serializable是最高级别的,但是影响性能,所以Serializable不常用。
但考虑一下这种情况:
有两个提交将更新同一行的字段(提交 A 和提交 B)。如果A和B同时发生,隔离级别不是Serializable,就会出现data race,导致字段不一致。但是在 Serializable 级别,这两个更新不会同时发生,所以要么 A 在 B 之前发生,要么 B 在 A 之前发生,并且该行要么在版本 A 中,要么在版本 B 中,但不会是 A 和 B 的某种混合B.
我以为ACID的原子性保证了A和B的同步。但是好像Atomicity的定义只保证一个事务发生"all or nothing",并没有说明并发提交。
那么我应该使用 Serializable 来防止数据竞争吗?哪一个ACID真正保证了一次更新的原子性?
没有。为避免您描述的问题,您不需要 "serializable"。还有其他隔离级别。你害怕的事,只有"read uncommitted"才会发生。对于任何其他隔离级别,单个记录中的字段将始终保持一致。
我正在尝试使用 Connector/J 和 MySql 在 Java(JDK1.8) 中构建应用程序。听说Serializable是最高级别的,但是影响性能,所以Serializable不常用。
但考虑一下这种情况:
有两个提交将更新同一行的字段(提交 A 和提交 B)。如果A和B同时发生,隔离级别不是Serializable,就会出现data race,导致字段不一致。但是在 Serializable 级别,这两个更新不会同时发生,所以要么 A 在 B 之前发生,要么 B 在 A 之前发生,并且该行要么在版本 A 中,要么在版本 B 中,但不会是 A 和 B 的某种混合B.
我以为ACID的原子性保证了A和B的同步。但是好像Atomicity的定义只保证一个事务发生"all or nothing",并没有说明并发提交。
那么我应该使用 Serializable 来防止数据竞争吗?哪一个ACID真正保证了一次更新的原子性?
没有。为避免您描述的问题,您不需要 "serializable"。还有其他隔离级别。你害怕的事,只有"read uncommitted"才会发生。对于任何其他隔离级别,单个记录中的字段将始终保持一致。