建立一个 Derby 日历,第 3 部分: 使用事务和锁定(上)
2010-04-19 00:00:00 来源:WEB开发网这是因为启用了 autocommit,所以数据库在每个语句之后立即提交。
现在看看如果关闭 autocommit,数据库在每个语句之后不提交会出现什么情况。
创建事务
Derby 允许关闭 autocommit 模式,因此可以看到创建事务的过程。在第一个窗口中关闭 autocommit,然后插入新的记录,如 清单 5 所示。
清单 5. 关闭 autocommit
ij> autocommit off;
ij> insert into demo (theText, minValue, maxValue) values ('third value',
100, 200);
1 row inserted/updated/deleted
现在从另一个窗口中选择数据,如 清单 6 所示。
清单 6. 选择未提交的数据
ij> select * from demo;
THETEXT |MINVALUE |MAXVALUE
--------------------------------------------------------------------------
ERROR 40XL1: A lock could not be obtained within the time requested
大约一分钟之后才能看到响应,这是数据库默认的等待时间。为何出现错误呢?有两个原因。首先,默认情况下,Derby 不允许查看未提交的行。其次,虽然 Derby 通常默认锁定单独的行,但是如果认为有必要,就会自动将其上升到锁定整个表。因为数据库和表都很小,这一行就占了数据库的很大比例,所以它锁定了整个表。(本教程后面将讨论 不同类型的锁定。)
提交事务
只要事务一直处于活动状态,锁就保持有效。可以通过提交来结束事务。在原来的窗口中 commit 该事务:
ij> commit;
然后再从第二个窗口中选择数据(参见 清单 7)。
更多精彩
赞助商链接