#mysql #orm #lock #locking

logic-lock

在 sea-orm 上实现的 MySQL 逻辑锁

6个版本 (1个稳定版)

新增 1.0.0 2024年8月8日
0.12.0 2023年8月18日
0.11.0 2023年2月7日
0.10.5 2022年12月2日
0.9.0 2022年11月7日

#12 in #locking

MIT 许可证

17KB
353

logic-lock

在 sea-orm 上实现 MySQL 逻辑锁

锁定

Lock::build 接收一个键,任何所有连接,因此它可以是 sea-orm::DatabaseConnection,一个 sea-orm::DatabaseTransaction 或另一个 Lock 本身,以及一个可选的超时时间,默认为 1 秒。
在发生错误的情况下,所有者连接将随数据库错误(如果有的话)一起返回,这样连接就不会自动丢弃。
Lock 本身充当连接,因此您可以在任何需要原始连接的地方使用它。

let lock = logic_lock::Lock::build("my_lock_key", conn, None).await.unwrap();

解锁

由于 MySQL 逻辑锁存在于会话中,而不是像表锁那样的事务中,因此未丢弃的锁将一直存在,直到连接结束。如果连接是连接池的一部分,这可能是一个非常长的时间。
要释放一个 Lock,只需使用 Lock::release 方法。
在成功的情况下,它将返回原始连接;在错误的情况下,它将返回 Lock 本身以及数据库错误(如果有的话)。

let conn = lock.release().await.unwrap();

删除

删除已锁定的 Lock 将记录一个错误。
为了避免在恐慌中引发恐慌的情况,已选择不引发恐慌。

依赖关系

~4.5–6MB
~136K SLoC