首先,我想确认开发人员是否有责任遵循这些属性或像JDBC这样的事务api的责任?
下面是我对如何在JDBC中实现酸性质的理解
原子性:-因为有一个事务与连接相关联,所以我们做提交或回滚,没有部分更新。因此实现
一致性:-当一些数据完整性约束被破坏时(比如一些检查约束),那么sqlexception将被抛出。然后程序员通过回滚事务来实现一致性数据库?
上面的一个问题假设我们执行了transaction1,并且在事务2期间抛出了SQL异常,如上所述。现在我们捕获异常并执行commit将第一个事务提交?
隔离:-由JDBC api提供。但是这会导致并发更新的问题。所以是手工处理的,对吧?
持久性:-由JDBC api提供。
请告诉我以上理解是否正确?
事务完整性的ACID原则由数据库实现,而不是由API(如JDBC)或应用程序实现。您的应用程序的责任是选择一个数据库和数据库配置,以支持您所需要的任何事务完整性,并正确识别应用程序中的事务边界。
当抛出异常时,应用程序必须确定是回滚整个事务还是继续进行其他处理。例如,如果您的应用程序正在处理来自供应商的订单,那么处理成功的99个订单并将失败的1个订单记录在某个地方以供用户调查,这可能是合适的。另一方面,你可以因为1个失败而拒绝所有100个订单。这取决于你的应用程序在做什么。
通常,一次只打开一个事务(或者更准确地说,每个连接一个事务)。因此,如果您正在处理事务2,那么根据定义,事务1已经完成——它之前已经提交或回滚。事务2中抛出的异常对事务1没有影响。
根据应用程序请求的事务隔离级别(以及数据库支持的事务隔离级别)以及应用程序的机制,您可能需要关注丢失的更新。如果您将事务隔离级别设置为read committed,那么您可能会在事务1中读取值为' a ',等待用户做某事,将值更新为'B',然后提交,而没有意识到事务2在读取数据和写入数据之间将值更新为'C'。这可能是你需要处理的问题,也可能是最后一个人更新一行以"获胜"是可以的。
另一方面,您的数据库应该负责自动锁定,以防止两个事务同时更新同一表的同一行。它可以通过锁定比严格必要的更多的数据来实现这一点,但它会以某种方式序列化更新。