Mysql 同时从不同程序访问同一数据库会产生什么后果?

Mysql 同时从不同程序访问同一数据库会产生什么后果?,mysql,jdbc,Mysql,Jdbc,我有一个使用JDBC访问的mysql数据库。如果我同时从两个不同的程序访问数据库,那么会对数据库产生什么影响 请说明两个程序何时读取数据库,一个正在读取,另一个正在写入数据,以及两个程序何时都在写入数据 我认为,当两个程序都写入数据时,肯定会导致数据丢失。但是在其他情况下会发生什么呢?MySQL在酸性基础上工作: 这意味着,两个客户端都将读取数据库,就好像它们是唯一的客户端一样 要实现这一点,每个客户机必须启动一个事务,这是一个单一的逻辑工作单元。在此事务中,必须提交或回滚对数据库执行的所有操作

我有一个使用JDBC访问的mysql数据库。如果我同时从两个不同的程序访问数据库,那么会对数据库产生什么影响

请说明两个程序何时读取数据库,一个正在读取,另一个正在写入数据,以及两个程序何时都在写入数据


我认为,当两个程序都写入数据时,肯定会导致数据丢失。但是在其他情况下会发生什么呢?

MySQL在酸性基础上工作:


这意味着,两个客户端都将读取数据库,就好像它们是唯一的客户端一样

要实现这一点,每个客户机必须启动一个事务,这是一个单一的逻辑工作单元。在此事务中,必须提交或回滚对数据库执行的所有操作

不同的RDBMS具有不同的事务支持默认值。对于MySQL,隔离级别为,这意味着同一事务中的SELECT语句彼此一致

如何验证这一点:

让program1启动一个事务并遍历每一行并增加一个值,而另一个程序启动一个事务并遍历数据库,计算所有行的相同值之和。完成后,他们关闭交易并打印结果。您会注意到,它们都读取数据库,就像它们彼此隔离一样

有很多关于JDBC的书。以下是一些可以帮助您开始的链接:

JDBC教程:


MySQL:

希望像PostgreSQL、MariaDB或其他主要数据库这样的MySQL能够被许多程序使用,每个程序都可以有许多连接。如果多个程序试图同时更新同一行,数据库将不会收支平衡。但是如何做到这一点是通过事务处理的客户端程序的问题


欢迎来到交易的世界!在事务中,数据库保证程序保持一定程度的一致性。原子性、一致性和持久性都没有问题,但是隔离稍微有点乏味。JDBC定义了4个级别的隔离,并且从以下内容中提取的事务完全没有:

接口连接包括五个值,它们表示可以在JDBC中使用的事务隔离级别:

Isolation Level Transactions Dirty Reads Non-Repeatable Reads/Phantom Reads TRANSACTION_NONE Not supported Not applicable Not applicable Not applicable TRANSACTION_READ_COMMITTED Supported Prevented Allowed Allowed TRANSACTION_READ_UNCOMMITTED Supported Allowed Allowed Allowed TRANSACTION_REPEATABLE_READ Supported Prevented Prevented Allowed TRANSACTION_SERIALIZABLE Supported Prevented Prevented Prevented 访问尚未提交的更新值被视为脏读,因为该值可能回滚到其以前的值

当事务A检索行,事务B随后更新行,事务A稍后再次检索同一行时,将发生不可重复读取。事务A检索同一行两次,但看到不同的数据


当事务A检索满足给定条件的一组行,事务B随后插入或更新一行,使该行现在满足事务A中的条件,事务A随后重复条件检索时,会发生幻像读取。事务A现在会看到另一行。此行被称为幻影。

这意味着,两个客户端都将读取数据库,就像它们是唯一的客户端一样。-这在很大程度上取决于所选的事务隔离级别。我想说的是,在大多数情况下,你所说的都不是真的。你的例子总是很好的:两个程序都不会崩溃。但程序计算总和的结果高度依赖于隔离级别。在事务_SERIALIZABLE中,它将在其他事务开始之前为值。在事务_READ_COMMITTED中,它将在提交另一个事务后立即使用更新的值,而在事务_READ_UNCOMMITTED中,它将如同在每次更新后提交另一个事务一样。不确定交易是否真正独立!。。在一个事务中,数据库保证程序根据所选的事务隔离级别保持一定的一致性,可能会出现数据异常。它实际上非常详细!我刚刚评论了一个关于担保物的特殊短语。