繁体   English   中英

分布式交易的完整性和机密性

[英]Integrity and Confidentiality in Distributed Transactions

我有一个关于分布式交易的问题。 假设我有3个交易程序:

交易A

  1. 开始
  2. a =读(A)
  3. b =读(B)
  4. c = a + b
  5. 写(C,c)
  6. 承诺

交易B

  1. 开始
  2. a =读(A)
  3. a = a + 1
  4. 写(A,a)
  5. 承诺

交易C

  1. 开始
  2. c =读取(C)
  3. c = c * 2
  4. 写(A,c)
  5. 承诺

因此,共有5对关键操作:C2-A5,A2-B4,B4-C4,B2-C4,A2-C4。

我应该确保完整性机密性 ,您对如何实现它有任何想法吗?

先感谢您!

您在帖子中所描述的是多用户系统中的常见情况。 不同的会话使用相同的表和相同的行同时启动事务。 这里有两个问题:

  1. 如果会话C在会话A更新了记录之后但在会话A提交事务之前读取了记录,会发生什么情况?
  2. 如果会话C更新了会话A已更新但未提交的相同记录,会发生什么情况?

(您的情况仅说明了其中的第一个问题)。

第一个问题的答案是iosation级别。 这是跨会话的未提交事务的可见性的定义。 ANSI标准指定了四个级别

  • 可SERIALIZABLE:从另一个会话看不到任何更改。
  • 可重复读取:允许幻像读取,即两次执行相同的查询可能会返回不同的结果。
  • 读取已提交:仅可见另一个会话已提交的更改。
  • READ UNCOMMITTED:禁止读入diryt,即在一个会话中未提交的更改在另一会话中可见。

不同的口味或数据库以不同的方式实现这些功能,并且并非所有数据库都支持它们。 例如,Oracle仅支持READ COMMITTED和SERIALIZABLE,并且将SERIALIZABLE实现为snapsot(即,它是只读事务)。 但是,它使用多版本并发控制来防止READ COMMITTED事务中的不可重复读取。

因此,回到您的问题,答案是:设置适当的隔离级别。 合适的级别取决于数据库支持的级别以及希望发生的行为。 可能您希望读取已提交或可序列化,也就是说,您希望基于与事务开始一致的数据值继续进行事务。

至于另一件事,答案很简单:事务必须在开始更新表之前对表或最好仅对必需的行发出锁。 这样可以确保事务可以继续更改这些值而不会导致死锁。 这称为悲观锁定。 在使用连接池的应用程序(即大多数基于Web的应用程序)中是不可能的,而且这种情况更加棘手。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM