数据库事务的ACID属性中A的原子性表明在数据库上进行的每个事务都像二进制数系统,0或1,全部或全部。
是否有可能在Java或C#等编程语言或任何其他通用语言中实现相同的功能? e.g。
public static Ticket GetTicket(string filePath) {
counter++;
Application app = new Application(filePath);
.
.
.
可能,我给出了一个不好的例子,但我相信这应该足以给出一个想法。现在,假设我创建Application
对象的行抛出异常,那么应用程序的执行将停止,静态变量counter
的状态将已经发生变异并且状态为系统改变了。有没有办法防止在抛出异常之前执行的语句造成损害?
答案 0 :(得分:5)
您正在考虑software transactional memory,其中包含Java和C#中的库实现
答案 1 :(得分:1)
这种功能最简单的机制是:
这样,在最后一步之前,实际上没有观察到对象引用的变化。
然而,如果没有更具体的问题,这将很难正确回答。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
将所有可变状态封装在不可变对象中。
理想情况下,不可变对象仅包含由公共getter属性封装的(私有)只读字段。必须使用传递给构造函数(或静态工厂方法)的数据初始化所有字段。
如果使用这样的不可变对象,则可以保证状态不会被部分更新(除了通过反射),这会为您提供事务语义。
任何希望更改部分状态的东西都必须构造并返回一个新的不可变对象实例,并适当地设置其所有状态。
(您也可以使用不可变接口来表示不可变对象,但是很难保证通过接口引用的对象不会被改变,因为实例可能真的是一个可变对象。)