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