2011-01-10 62 views
4

我必须为我们的用户管理工具创建一个批量插入功能。我们使用spring LDAP构建了一个小型内部库,对于单用户管理(CRUD),一切正常。Java中的LDAP事务

我想尝试一次插入数百条记录并在出现错误时回滚。

有没有办法在LDAP中创建事务,就像它存在于数据库中一样?

感谢您的想法。

回答

3

这是一个@adrianboimvaser随访。

只需注意Spring LDAP transaction support未使用XA事务,而是“逻辑”补偿事务,因此LDAP的回滚将成为对LDAP的补偿操作。虽然这是对没有事务的改进,但请注意这与典型事务不同,“就像它存在于数据库中一样”。即不支持事务的ACID属性。

注意,即使使用相同的 逻辑事务,这 不是JTA XA交易;没有 将执行两阶段提交, 因此提交和回滚可能会产生意想不到的结果 。

例如:如果要将100个条目添加到LDAP,则每个记录将逐个添加到LDAP。如果最后一次添加失败,则回滚操作将删除之前在事务中创建的99个条目。但是,如果由于某种原因(例如,网络连接归结为造成第100个条目失败的LDAP),则前99个条目实际上不能被删除,即使您试图回滚事务,也会出现不一致数据库和LDAP。即在LDAP中将有99条记录(因为它们不能被删除),这些记录不存在于数据库中(因为这些记录从未插入或实际上被回滚)。

我不确定你的情况是什么,但是如果你有频繁的LDAP更新,你可能要考虑使用一个实际的数据库来避免交易头痛以及优化性能,因为LDAP是为快速读取而设计的写得比较慢。

+0

阅读规范链接和您的评论清楚地表明,假交易是相当危险的。无论如何,我仍然必须使用LDAP,因为这是要求的一部分,而那些大批量的产品并不常见。我想我会跟踪自己的插入情况,并尝试在发生某些事情时手动将它们回滚。这基本上是这些交易无论如何将做什么。 – IceGras 2011-01-10 20:44:18