交易理论

时间:2009-04-03 06:36:53

标签: database transactions

(我在DAO模式实现中有一个简单的CRUD API。) 所有操作(保存,加载,更新,删除)都具有必须提供的事务ID。 所以,例如。它可能做到:

...

id = begintransaction();
dao.save(o, id);
sao.update(o2, id);
rollback(id);

除了加载调用之外的所有示例都很直观。但是一旦你开始从数据库加载对象,事情“感觉”有点不同。根据定义,加载操作是否与事务相关联?或者我的装载操作应该算作单个工作量吗?

2 个答案:

答案 0 :(得分:4)

取决于您正在使用的事务隔离级别(http://en.wikipedia.org/wiki/Isolation_(database_systems)),但通常它们应该是事务的一部分。如果其他人正在更新您尝试阅读的数据,该怎么办?如果读取操作不是事务性的,那么您将获得旧数据,并且您可能对最新数据感兴趣。

答案 1 :(得分:2)

如果数据库设置为合适的隔离级别,则只能从创建它们的事务中读取未提交的写入。例如,在Oracle中,如果过程插入或更新行,然后(不提交)调用另一个过程,该过程使用“pragma autonomous_transaction”在单独的事务中运行,则其他过程不会看到新行。 (用脚射击自己的好方法,顺便说一下。)

出于这个原因,您应该始终将加载操作视为与事务相关联。