当前位置: 首页 > 知识库问答 >
问题:

事务隔离和并发

阮飞翔
2023-03-14

我正在尝试用Connector/J和MySql构建一个Java(JDK1.8)应用程序。有人告诉我,Serializable是最高级别,但它会影响性能,所以Serializable并不常用。

但是考虑一下这种情况:

有两个提交将更新同一行的字段(提交A和提交B)。如果A和B同时发生,并且隔离级别不可序列化,则会出现数据竞争,这会导致字段不一致。但在可序列化级别,这两个更新不会同时发生,因此A发生在B之前或B发生在A之前,行将在版本A或版本B中,但不是A和B的混合。

我认为ACID的原子性保证了A和b的同步,但是原子性的定义似乎只保证了一个事务“要么全部要么全部不发生”,它没有提到并发提交。

那么我应该使用序列化来防止数据竞争吗?哪个ACID实际上保证了一个更新的原子性?

共有1个答案

欧阳俊明
2023-03-14

不。为了避免你描述的问题,你不需要“可序列化”。还有其他隔离级别。你害怕的事情,只有在“未提交读”的情况下才会发生。对于任何其他隔离级别,单个记录中的字段将始终保持一致。

 类似资料:
  • MSDN 描述其 OLEDB 提供程序的 JET 事务隔离,如下所示: Jet支持事务中的五级嵌套。事务唯一支持的模式是提交读取。设置较低级别的事务分离意味着提交读取。设置更高的级别将导致StartTransaction失败。 Jet仅支持单相提交。 MSDN对的描述如下: 指定读取数据时保持共享锁,以避免脏读,但可以在事务结束前更改数据,从而导致不可重复读取或幻像数据。此选项是SQL服务器默认值

  • 主要内容:事务概述,事务的四大特性,并发事务问题,事务的隔离级别,演示:,总结事务概述 事务是一个或一组sql语句组成的一个执行单元,这个执行单元要么全部执行成功,要么全部执行失败。用于保证数据的完整性。 如账户转账,张三给李四转500,对应的sql语句应该是update张三的 余额-500,并且update李四的余额+500,如果先更新完张三的数据,然后出现了异常,导致李四的余额修改不了,那么就出现数据上的问题了,应该使用事务来解决这一问题,当中间出现异常后回滚,让张三的

  • 本文向大家介绍说一下 spring 的事务隔离?相关面试题,主要包含被问及说一下 spring 的事务隔离?时的应答技巧和注意事项,需要的朋友参考一下 spring 有五大隔离级别,默认值为 ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致: ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么; ISOLATI

  • 我有一个对具有 SQL API 的 Cosmos 容器的长期运行查询,该查询需要 10 分钟以上才能完成。有没有办法将数据库的隔离级别设置为“可重复读取”或“可序列化”,以避免幻像读取,如这里所定义的那样? 我知道我们可以为 Cosmos DB 设置一致性级别,但它仅适用于地质副本之间的读/写一致性,而不适用于事务隔离。

  • 我将spring应用程序连接到smartbaer servicev,在那里创建了虚拟数据源(Postgres)。 驱动程序类: 连接字符串(本地servicev虚拟服务器url): 应用程序.属性:- spring.datasource.driver-class-name=com.smartbear.servicev.jdbc.driver.jdbcvirtdriver spring.dataso