EJB原理之(三)--事务容器的出现

来源:互联网 发布:c语言或者符号 编辑:程序博客网 时间:2024/05/01 18:42
事务容器由来已久,关于事务容器的历史,我也说的不是很确切,怕说出来让大家笑话,还是大家自己去查阅一下吧。
 
  先说说为什么使用事务容器吧,在“纯SQL阶段”,其实所有的问题基本都能够解决,数据的操作使用SQL,逻辑运算使用高级语言,网络也是通的,大家到处都可以运行程序,数据也是集中的,沟通很迅速,似乎都可以搞定,但是后来出现一个很头痛的问题,就是随着逻辑越来越复杂的时候,代码维护成本急剧上升,主要是由于遍地出现的SQL语句。

  首先,开发的过程至少有两种语言,SQL和另一种高级语言,开发以高级语言为主,SQL在高级语言中都以字符串的形式保存,大家都知道代码中的字符串很容易出问题,因为字符串中出现的错误都是运行时错误,不是编译时错误,也就是说一旦错误出现在字符串中,只有运行的时候这个错误才会出现,所以给开发带来很大的隐患,如果测试不完全,有些错误可能会在运行和很久之后才会出现,这样错误代价很大。

  其次,SQL语句被到处复制,由于事务的关系,很多操作一次性需要执行一堆的操作,所以同样一个语句,会在不同的地方被不断的复制,复制的时候很有可能出错,少一个字符,多一个字符都是很常见的,最可怕的是后来这个语句需要操作的那个表修改了结构,而这个语句已经被引用了N次,GOD,这会是一场灾难,如果有一处没有被修改,那么最后的错误就会是致命的,谁都不能确定这个错误是不是还存在,因为这是一个“运行时错误”。

  举个例子,一个用户发帖的时候加一分,回复的时候加一分,这是两个功能,使用纯SQL方式写一段伪代码:

  //发帖:
    public void 发帖() {
         打开连接;
        开始事务;
        String sql1 = "insert into 帖子 values (....);";
        String sql2 = "update 用户 set 积分 = 积分+1 where user_id = .....;";
        执行sql1;
        执行sql2;       
        提交事务;
        关闭连接;
    }

  //回帖:
    public void 回帖 () {
        打开连接;
        开始事务;
        String sql1 = "insert into 回帖 values (....)";
        String sql2 = "update 用户 set 积分 = 积分+1 where user_id = .....;"
        执行sql1;
        执行sql2
        提交事务;
        关闭连接;
    }

    大家看到,对于积分操作的sql2语句是被重复的,而且这些SQL语句都是字符串,后来增加了一些功能,发照片加一分,上传音乐加一分,等等…………,后来这个语句就到处再被重复,后来功能很多的时候,突然决定,积分不应该放在“用户”表中,应该建立一个“用户积分”表进行统一管理,同时结构和以前完全不同,这是一个噩耗,因为所有重复的语句都需要被修改,虽然有查找替换功能,但是如果一旦出一个小小的错误都将是致命的,我这里举的例子还是一个小系统,如果是一个银行系统呢,这个错误一旦被放大,后果是不敢想像的。

    所以,为了解决由于SQL语句的重复带来的问题,事务容器应运而生,上面两个方法中之所以会出现语句的重复,主要是为了事务的完整性,因为这些语句都需要放在一个事务中,需要一次性的执行,要么一起成功,要么一起失败,但是基于SQL的开发模式无法避免这种重复的出现,而事务容器则可以解决这种重复的问题。

    下面是一段伪代码,用来说明使用事务容器之后的状况:

    public void 用户加分( int 分数, String user_id) {
       
        String sql = "update 用户 set 积分 = "+ 分数 +"where user_id = .....;"
        执行sql;

    }

  //发帖:
    public void 发帖() {        
        String sql1 = "insert into 帖子 values (....);";       
        执行sql1;
        用户加分 ( 1, user_id );       
    }

  //回帖:
    public void 回帖 () {       
        String sql1 = "insert into 回帖 values (....)";       
        执行sql1;
        用户加分 ( 1, user_id );   
    }

大家看到,所有和用户加分的操作都放置在了“用户加分()”方法中,这样其他的代码都重用了这个方法,当加分策略需要改变的时候,只需要更改“用户加分()”一个方法中的内容即可,其他代码都非常安全,而所有关于事务的操作最终都交给了事务容器。

事务容器的出现,大大简化了开发的难度,降低了开发风险,尤其是“降低风险”这一项,可以节约大量的成本,因为大家做开发就会发现,我们大部分的时间都用来寻找错误和修改错误,出错概率减小了,开发效率也就大大提高了。

 
原创粉丝点击