MySQL 表管理器
MySQL 引擎允许用户级别的锁。本文解释了如何操作这些锁类型。
引言
MySQL 引擎允许用户级别的锁:GET_LOCK()
和 RELEASE_LOCK()
函数。IS_FREE_LOCK()
用于检查锁。LockTable
是从用户角度处理锁的函数;它将持续循环,直到获得锁。ReleaseTable
函数将处理数据库用户级别锁的释放。带有 try / catch 块的 LockTable
和 ReleaseTable
函数可用于安全地处理数据库异常。函数如果一切顺利将返回 true,如果发生异常则返回 false。
背景
程序使用 ODBC 连接字符串连接到测试 MySQL 数据库。程序从用户那里获取事务(查询、插入、更新),并将它们放入数组中。在输入每个事务后,用户按下“添加事务”按钮。在输入所有事务后,用户按下“运行”按钮。
程序基于其他事务的锁进行工作,通过程序中的两个按钮进行模拟。这两个按钮是处理其他事务,用于锁定表,以及结束其他事务,用于解锁表。程序在处理事务之前测试独占锁。
如果表被锁定,则通过调用 SELECT IS_FREE_LOCK('TPS')
来释放表。如果表当前被锁定,我们将使用 Thread.Sleep(x);
在一段时间后重试。如果表未被锁定,我们将执行锁定查询 SELECT GET_LOCK('TPS',x)
来锁定表。这里,x
是超时时间。
SELECT RELEASE_LOCK('TPS')
查询用于释放锁。
ExecuteQueries
是执行所有处理的主要函数。它调用 LockTable
函数以在用户级别锁定表。它初始化一个 Transaction
对象,将查询放置在数据库中,提交或回滚事务,调用 ReleaseTable
函数,并返回执行操作的结果。
使用代码
下载代码并在 MySQL 测试数据库中创建一个名为 TPS 的表,其模式如下(Course
、Professor
、Schedule
、Students
)。所有字段都是字符 (Text
);Students
字段是一个 number
)。
运行附带的程序,并按照以下示例输入数据
--Example query
select * from tps where course ='transactions';
--Example insert
insert into tps values('TestCourse', 'Dr. MAJO', 'MWF', 25);
--Example update
update tps set course='TestCourse' where professor='Dr. MAJO';
--Example delete
delete from tps where course='test';
在输入 SQL 语句后,按下添加事务,然后按下处理另一个事务。现在按下运行。由于表被另一个事务独占锁定,程序将不会运行 SQL 语句。按下结束其他事务,现在您的 SQL 语句将运行。