首先,我想确认的是,遵循这些属性是开发人员的责任,还是像JDBC这样的事务Apis的责任?
下面是我对如何在JDBC中实现acid属性的理解
原子性:由于存在一个与连接关联的事务,因此我们执行提交或回滚,因此没有实现部分updation.Hence
一致性:-当一些数据完整性约束无效时(比如一些检查约束),那么sqlexception将被抛出。然后程序员通过回滚事务来接受一致的数据库?
上面的一个问题是,我们做transaction1,sql excpetion在事务2期间抛出,如上所述。现在我们捕获异常,提交第一个事务是否会被提交?
隔离:-由JDBC Apis.But提供,这会导致并发更新的问题。所以它是手动处理的,对吗?
持久性:-由JDBC Apis提供。
如果上面的理解是正确的,请让我看看。
发布于 2011-07-15 04:10:51
事务完整性的ACID原则是由数据库实现的,而不是由API (如JDBC)或应用程序实现的。您的应用程序的责任是选择一个数据库和支持您所需的任何事务完整性的数据库配置,并正确地标识应用程序中的事务边界。
当抛出异常时,您的应用程序必须确定是适合回滚整个事务还是继续进行其他处理。例如,如果您的应用程序正在处理来自供应商的订单,则可能适合处理成功的99个订单,并将失败的1个订单记录在某个位置,以供用户调查。另一方面,您可能会因为一个订单失败而拒绝所有100个订单。这取决于您的应用程序正在做什么。
通常,您一次只打开一个事务(或者,更准确地说,每个连接一个事务)。因此,如果您正在处理事务2,那么根据定义,事务1已经完成了--它之前要么已提交,要么已回滚。事务2中抛出的异常对事务1没有影响。
根据应用程序请求的事务隔离级别(以及数据库支持的事务隔离级别)以及应用程序的机制,丢失的更新可能是您需要关注的问题。如果您将事务隔离级别设置为read committed,那么您可能会将事务1中的值读取为'A‘,等待用户执行某些操作,将该值更新为'B',然后提交,而没有意识到事务2在您读取数据的时间和写入数据的时间之间将该值更新为'C’。这可能是您需要处理的问题,也可能是最后一个人更新行以“赢”的问题。
另一方面,您的数据库应该注意自动锁定,以防止两个事务同时更新同一个表的同一行。它可以通过锁定超过严格需要的内容来做到这一点,但它会以某种方式序列化更新。
https://stackoverflow.com/questions/6699131
复制相似问题