相对于全新的对象存储而言(不管是纯粹面向对象的数据库,还是ORM系统),关系数据库除了不能按面向对象方式进行编码外,其它许多方面都优于目前的对象存储技术。
拿事务来说,关系数据库事务有如下几个基本假设:
1.事务发生在连接上,是由客户端发起的。例如使用JDBC编写程序,大致如下:
...
//创建到数据库的连接
Connection conn = DriverManager.getConnection("", "", "");
//设置连接自动提交,请注意,事务没有显式声明,而是隐含在连接中
conn.setAutoCommit(true);
//所有语句与连接绑定
Statement stat = conn.createStatement();
//所有数据库操作与语句绑定,也就是与连接绑定
stat.executeUpdate("");
//最后,提交通过连接进行
conn.commit();
2. 数据库端的存储过程等内容,看似与连接无关,其实执行时还得靠连接,如下:
create procedure test as
update test set name='a';
...
但该存储过程的执行是由客户端通过连接发起的,具体过程不再论述。
相对于数据库事务而言,对象事务在实现上有一定的难度,针对目前流行的JDO而言,其写法大致如下:
//一个pm相当于数据库的一个连接
PersistanceManager pm;
//一个连接对应一个事务
Transaction trans = pm.currentTransaction();
trans.begin();
//查询与pm对应,也就与事务对应
Queray q = pm.newQuery(Student.class);
Collection c = (Collection)q.execute();
//查找出来的对象与query对应,从而与事务对应
Student s = (Student)c.iterator().next();
s.setName("a");
trans.commit();
从上面程序我们看不出JDO事务与数据库事务有什么区别,但是请注意,如果有两个pm,这两个pm同时修改同一个对象,安装关系数据库的一般认识,第二个pm应当无法修改对象,因为第一个pm会把对象锁定,但在JDO中,这一点是无法达到的。