并行更新数据的一种途径是用开放式锁定。开放式锁定工作原理是通过应用程序来检查数据是否被更新(被其他事务修改造成的)而实现的。一种更普通的实现开放式锁定的方法是在每个表中添加一个“版本列”(version column),对每个表而言,程序每次改变其中一行的时候都会更新这个“版本列”。每个UPDATE语句中的WHERE语句会根据上次查询的结果判断这个版本号是不是被更改了。在事务访问数据库中的数据时,程序中可以用PreparedStatement.executeUpadte()这个函数的返回值来检查行的个数,从而判断是否要继续执行UPDATE语句。如果数据中的行已经被其他的事务更新或者删除了,那么程序会让该事务从新访问数据库。
用开放式锁定机制来锁定那些直接执行SQL语句的应用程序是非常简单的。但是,用持久层构架(比如JDO和Hibernate)实现更容易,因为他们已经提供了开放式锁定机制――在配置选项中。一旦在配置选项中,选中了这种方式,持久层构架会自动的生成SQL的UPDATE语句来完成版本检查的任务。开放式锁定的名字来源于一种假设的情况,在这种情况下:并发更新的机会非常少,而且程序只能检测、覆盖这些数据而不能防止这种事情的发生。另外一种可选的途径是用保守式锁定,使用他的假设条件是:并发更新肯定会发生,而且必须被禁止。
保守式锁定
对于开放式锁定来说,另外一种途径是使用保守式锁定。当一个事务读取某些行的数据时,他会对这些数据加锁,这样就防止其他的事务访问这些数据了。具体的实现是需要数据库支持的,然而不幸的是,不是所有的数据库都支持保守式锁定。如果你的数据库支持话,那么你的应用程序直接执行SQL语句来实现保守式锁定将非常容易。但是,可能你已经猜到了,在程序中用JDO或者Hibernate来实现保守式锁定更容易,JDO以配置选项的方式提供了保守式锁定,而Hibernage提供了简单的API实现锁定对象。
除了可以处理单个数据库事务并行问题,常常你还需要处理多数据库事务的并行问题。
决策5:在长事务下处理并发访问
文章来源于领测软件测试网 https://www.ltesting.net/