简介:
您曾经和其他人一起使用过Dropbox吗,而您都修改了同一个文件?曾经有一个带有关系数据库的多用户应用程序,而两个人正在修改(或更糟的是,一个人正在删除而另一个人正在修改)同一对象?好吧,让我们用这个挑战(排序)模拟一下。
为了应对这一挑战,我们只有两个用户和一个或两个相关文件。两个用户都具有CRUD(创建,读取,更新和删除)所有文件的一般特权。
挑战:
输入:
我们将提供一些输入(输入格式灵活,并且可以使用任何合理的格式):
1)锁定模式(开/关):乐观和悲观并发锁定之间的区别。
两个用户都可以CRUD(创建,读取,更新和删除)所有内容,但有时可能会发生错误或问题。根据锁定模式的不同,关闭时可能会出现问题,而打开时可能会出错。下面在“ 输出”部分对此进行了说明。
2&3)两个用户操作。这些操作始终包括两件事:用户执行的操作(创建,读取,更新或删除)以及针对哪个文件。
输出:
我们将有三个可能的输出:
- 有效:两个用户的两个操作可以同时完成,而不会发生任何问题。
- 错误:两个用户的两个操作不能同时进行,并且会导致其中一个用户出错(哪个用户与此挑战无关)。在以下情况下可能会发生这种情况:
- 一个用户读取或更新另一个用户删除的文件;
- 两个用户都在锁定模式下打开了同一文件;
- 一个用户创建另一个用户读取/更新/删除的文件(这意味着该文件已经存在,因此无法创建);
- 两个用户都创建相同的文件。
- 问题:两个用户的两个操作可以同时执行,但是可能导致意外的问题。在以下情况下可能会发生这种情况:
- 两个用户都在锁定模式关闭时更新文件;
- 一个用户更新另一个用户读取的文件;
- 两个用户都删除同一个文件(实际上,这将对第二个用户造成错误,但是由于仍会按照用户想要的方式将其删除,因此,为了这个挑战,这将是一个问题而不是错误)
挑战规则:
- 所有输入和输出都是灵活的,每个人都应说明其答案中使用了哪一个!
输入示例:0
/1
用于锁定模式&31
(第三个动作:更新;文件:1)和21
(第二个动作:读取;文件:1);true
/false
用于锁定模式&['C','A']
(操作:创建;文件:A)&['D','B']
(操作:删除;文件:B);等
实施例输出:null
/true
/false
(空=有效;真=错误;假=问题);-1
/0
/1
(-1 =错误; 0 =问题; 1 =有效); 但是,对于这三种输出类型,这三种可能的输出必须是唯一且不同的。 - 文件的调用无关紧要,也可以从上面的输入示例中看到。因此,请在您的答案中随意使用由单个(ASCII)字母或数字组成的任何类型的文件名。他们必须在所有的测试案例一致然而,这样你就不能使用
A
/B
在一个测试用例和1
/2
在另一个。 - CRUD的四个动作也必须是唯一且一致的值。所以你不能使用
'D'
/'C'
在一个测试用例,然后4
/1
在另一个测试案例。 - 您可以假设用户选择的文件在要读取,更新或删除时始终存在。
通用规则:
- 这是代码高尔夫球,因此最短答案以字节为单位。
不要让代码高尔夫球语言阻止您使用非代码高尔夫球语言发布答案。尝试针对“任何”编程语言提出尽可能简短的答案。 - 标准规则适用于具有默认I / O规则的答案,因此您可以使用STDIN / STDOUT,具有正确参数的函数/方法以及返回类型的完整程序。您的来电。
- 默认漏洞是禁止的。
- 如果可能的话,请添加一个带有测试代码的链接(即TIO)。
- 另外,强烈建议为您的答案添加说明。
所有可能的测试用例(动作可以按输入顺序†):
†:您应该支持以下测试用例的所有(最多四个)变体。因此,如果有一个测试用例说明action1: Create file A; action2: Update file B
,则该测试用例也应具有相同的结果action1: Create file B; action2: Update file A
;action1: Update file B; action2: Create file A
; 和action1: Update file A; action2: Create file B
。
Valid use-cases:
locking mode: either; action1: Create file A; action2: Create file B
locking mode: either; action1: Create file A; action2: Read file B
locking mode: either; action1: Create file A; action2: Update file B
locking mode: either; action1: Create file A; action2: Delete file B
locking mode: either; action1: Read file A; action2: Read file A
locking mode: either; action1: Read file A; action2: Read file B
locking mode: either; action1: Read file A; action2: Update file B
locking mode: either; action1: Read file A; action2: Delete file B
locking mode: either; action1: Update file A; action2: Update file B
locking mode: either; action1: Update file A; action2: Delete file B
locking mode: either; action1: Delete file A; action2: Delete file B
Error use-cases:
locking mode: either; action1: Create file A; action2: Create file A
locking mode: either; action1: Create file A; action2: Read file A
locking mode: either; action1: Create file A; action2: Update file A
locking mode: either; action1: Create file A; action2: Delete file A
locking mode: either; action1: Read file A; action2: Delete file A
locking mode: on; action1: Update file A; action2: Update file A
locking mode: either; action1: Update file A; action2: Delete file A
Problem use-cases:
locking mode: either; action1: Read file A; action2: Update file A
locking mode: off; action1: Update file A; action2: Update file A
locking mode: either; action1: Delete file A; action2: Delete file A
B/B
案件都排除在外了,因为我认为它们与相似A/A
。那就是差异的来源。但我想这想法是不正确的,如果你有这些文件的特定值..