0

数据库事务的 ACID 属性中的 A 原子性表明,在数据库上执行的每个事务都类似于二进制数系统,0 或 1,全有或全无。

是否有可能在 Java 或 C# 等编程语言或任何其他通用语言中实现相同的目标?例如

public static Ticket GetTicket(string filePath) {
  counter++;
  Application app = new Application(filePath);
  .
  .
  .

可能,我举了一个不好的例子,但我相信这应该足以给出一个想法。现在,想象一下,如果我创建Application对象的行抛出异常,那么应用程序的执行将停止,静态变量的状态counter已经发生了变化,系统的状态也发生了变化。有没有办法防止在抛出异常之前执行的语句造成损害?

4

4 回答 4

5

您正在考虑软件事务内存,它具有 Java 和 C# 中的库实现

于 2013-07-29T17:41:24.590 回答
1

这种功能的最简单机制是:

  1. 克隆将被以下语句变异的对象
  2. 变异克隆的对象
  3. 更新引用以指向克隆的对象

这样,在最后一步之前,实际上不会观察到对象引用的变化。

然而,如果没有更具体的问题,这将很难正确回答。

于 2013-07-29T17:46:20.570 回答
0

在拍摄事件之前将所有状态保存在一些变量等中。然后在 try catch 结构中进行更改。在缓存中然后将所有更改回滚到其原始状态

int a = 5;
int b = 1;

int a2 = a;
int b2 = b;

try
{
 a += 10;
 b -= 1;
 a /= b;
}
catch(Exception ex)
{
 //roll back;
 a = a2;
 b = b2;
}
于 2013-07-29T17:56:28.630 回答
0

将所有可变状态封装在不可变对象中。

理想情况下,不可变对象仅包含由公共 getter 属性封装的(私有)只读字段。所有字段都必须使用传递给构造函数(或静态工厂方法)的数据进行初始化。

如果您使用这样的不可变对象,则可以保证状态不能部分更新(通过反射除外),这为您提供了事务语义。

任何希望改变部分状态的东西都必须构造并返回一个不可变对象的新实例,并正确设置其所有状态。

(您也可以使用不可变接口来表示不可变对象,但很难保证通过接口引用的对象不会发生变异,因为实例可能确实是可变对象。)

于 2013-07-29T18:00:25.973 回答