同时从不同程序访问同一个数据库有什么后果?

时间:2014-07-02 05:12:09

标签: mysql jdbc

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

请注意两个程序何时读取数据库,一个是读取数据,另一个是写入数据,两者都在写数据。

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

2 个答案:

答案 0 :(得分:4)

MySQL基于ACID工作:http://en.wikipedia.org/wiki/ACID

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

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

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

如何验证:

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

有关于JDBC的全书。以下是一些可以帮助您入门的链接:

JDBC教程:http://docs.oracle.com/javase/tutorial/jdbc/

MySQL:http://dev.mysql.com/doc/refman/5.0/en/innodb-consistent-read.html

答案 1 :(得分:3)

希望像PostgreSQL,MariaDB或其他主要数据库这样的MySQL接受许多程序使用,每个程序都允许有许多连接。即使多个程序试图同时更新同一行,数据库也不会中断。但是......如何做到是客户端程序的问题通过交易。

欢迎来到ACID交易的世界!在事务中,数据库保证程序保持一致性。原子性,一致性和耐久性没有问题,但隔离有点单调乏味。 JDBC定义了4级隔离,加上根本没有事务(从The Java Tutorials : Using Transactions中提取):

接口Connection包含五个值,表示可在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现在看到一个额外的行。这一行被称为幻像。