【发布时间】:2014-04-10 17:51:15
【问题描述】:
我正在寻找一个实现命令模式的文件系统库,因此我可以撤消在文件系统中所做的更改,例如由于数据库错误,我可以以原始方式轻松保护数据完整性(可能是悲观锁定)。 ..
你知道这样的系统,还是我必须自己实现?
这个例子会有点虚,因为我们通常会用文件替换来做,我们会将文件名保存在数据库中。请暂时忘记这一点...
例子:
try {
$delete = $file1->delete();
$create = $file2->create();
$trans = $db->createTransaction(function () use ($db){
$stmt = $db->prepare('UPDATE files SET name = :new_name WHERE name = :old_name');
$stmt->execute(array(
'old_name' => $file1->name,
'new_name' => $file2->name
));
});
$trans->commit();
}
catch(Exception $e){
if ($trans)
$trans->rollback();
if ($create)
$create->undo();
if ($delete)
$delete->undo();
throw $e;
}
办公室。我想自动处理回滚,并检查文件锁定顺序(如果有锁)是否为 abc 以防止死锁。
例如使用类似这样的界面:
try {
$commands = new Commands();
$commands->add(new FileDeleteCommand($file1));
$commands->add(new FileCreateCommand($file2));
$commands->add(new DatabaseTransaction(
function ($db) use ($file1, $file2){
$stmt = $db->prepare('UPDATE files SET name = :new_name WHERE name = :old_name');
$stmt->execute(array(
'old_name' => $file1->name,
'new_name' => $file2->name
));
}
));
$commands->execute();
}
catch(Exception $e){
$commands->undo();
throw $e;
}
这种方法有一些限制,例如我必须在最后提交事务,因为当它已经提交时我无法回滚它,但我可以忍受......
或替代接口:
try {
$transactions = new DistributedTransaction();
$transactions->add(new FileSystemTransaction(
function () use ($file1, $file2){
$file1->delete();
$file2->create();
}
));
$transactions->add(new DatabaseTransaction(
function ($db) use ($file1, $file2){
$stmt = $db->prepare('UPDATE files SET name = :new_name WHERE name = :old_name');
$stmt->execute(array(
'old_name' => $file1->name,
'new_name' => $file2->name
));
}
));
$transactions->commit();
}
catch(Exception $e){
$transactions->rollback();
throw $e;
}
问题是我们如何一次提交 2 个事务?我认为我们实现其中之一的唯一方法:文件系统事务,但我愿意接受建议......
我添加了一个新标签,我认为这是一个简单的distributed transaction 问题,涉及数据库事务资源和文件系统事务资源。
【问题讨论】:
-
事务数据库有什么问题?
-
没什么,我只是不想将文件存储在数据库中。顺便提一句。我喜欢有选择...
-
但是您正在寻找的是事务数据库。或者你的意思是VCS?喜欢 git/SVN 吗?
-
不。我想将上传的文件和它们的名称存储在数据库中。在这种情况下,数据完整性可能会被破坏,例如当数据库连接失败并且文件已被修改时。悲观锁定或带有临时多版本文件的乐观锁定可以是解决方案,但我不想构建整个数据库,只是一个简单的保护。
-
我添加了一个例子,也许它更干净。
标签: php transactions filesystems distributed-transactions