使用JDBC实现ACID属性?

使用JDBC实现ACID属性?,jdbc,Jdbc,首先,我想确认,遵循这些属性是开发人员的责任,还是像JDBC这样的事务API的责任 下面是我对如何在JDBC中实现acid属性的理解 原子性:-由于有一个事务与连接关联,所以我们进行提交或回滚,不存在部分更新。因此实现了 一致性:-当出现一些数据完整性约束(比如一些检查约束)时,将抛出sqlexception。然后程序员通过回滚事务来查看一致性数据库 上面的一个问题是,我们执行transaction1,并且在事务2期间抛出sql excpetion,如上所述。现在,我们捕获异常并进行提交。是否提

首先,我想确认,遵循这些属性是开发人员的责任,还是像JDBC这样的事务API的责任

下面是我对如何在JDBC中实现acid属性的理解

原子性:-由于有一个事务与连接关联,所以我们进行提交或回滚,不存在部分更新。因此实现了

一致性:-当出现一些数据完整性约束(比如一些检查约束)时,将抛出sqlexception。然后程序员通过回滚事务来查看一致性数据库

上面的一个问题是,我们执行transaction1,并且在事务2期间抛出sql excpetion,如上所述。现在,我们捕获异常并进行提交。是否提交第一个事务

隔离:-由JDBCAPI提供。但这会导致并发更新的问题。所以它是人工处理的,对吗

耐久性:-由JDBCAPI提供


请告诉我上述理解是否正确?

事务完整性的ACID原则是由数据库实现的,而不是由API(如JDBC)或应用程序实现的。应用程序的职责是选择支持所需事务完整性的数据库和数据库配置,并正确标识应用程序中的事务边界

抛出异常时,应用程序必须确定是否适合回滚整个事务或继续进行其他处理。例如,如果您的应用程序正在处理来自供应商的订单,则可能需要处理成功的99个订单,并在某处记录失败的1个订单,以便用户进行调查。另一方面,您可能会因为1个订单失败而拒绝所有100个订单。这取决于你的应用程序在做什么

通常,一次只打开一个事务(或者更准确地说,每个连接打开一个事务)。所以,如果您正在处理事务2,那么根据定义,事务1已经完成了——它之前已经提交或回滚。事务2中引发的异常对事务1没有影响

根据应用程序请求的事务隔离级别(以及数据库支持的事务隔离级别)以及应用程序的机制,丢失的更新可能需要引起关注。如果将事务隔离级别设置为read committed,则可能会将事务1中的值读取为“a”,等待用户执行某项操作,将该值更新为“B”,然后在未意识到事务2在读取数据和写入数据之间将该值更新为“C”的情况下进行提交。这可能是您需要处理的问题,也可能是最后一个人可以将行更新为“win”的问题

另一方面,数据库应该负责自动锁定,防止两个事务同时更新同一表的同一行。它可以通过锁定比严格必要的更多的内容来实现这一点,但它会以某种方式序列化更新