上图说明的问题:
结论:通常情况下一个 session 内只会处理一个事务,所以大多数时候可直接调用 session.beginTransaction() 方法创建一个全新的 transaction 对象,并开始该事务。
上图说明的问题:
结论:当 session.beginTransaction 被调用之后,不管是用 session.getTransaction 还是 getCurrentTransaction 返回的都是同一个 transaction 对象;如果没有开始事务,getTransaction 会创建一个新的 transaction 对象,getCurrentTransaction 会返回 null。
结论:上图说明,每次调用 session.getTransaction() 都会创建全新的 Transaction 对象,如果是这样,那这个方法如果叫 session.createTransaction() 或许更加合理,但是呢,如果 session 已经有 begin 了的 transaction,该方法又不会创建新的 transaction。所以说,这个命名真的是一个巨大的坑,在程序中应该避免使用这个方法,否则难以理解是否是同一个 Transaction 对象;
结论:上图说明,session.getTransaction().begin() 与 session.beginTransaction() 是完全一模一样的。一个 session 同时只能有一个 transaction 是 active 的(开启状态)。
那么,既然一个 session 可以通过 session.getTransaction() 创建无数个 Transaction 实例,那么这些 Transaction 实例是否可以独立工作呢?但是下方的最后一行代码就报错了:
- Transaction transaction1 = db.getSession().getTransaction();
- Transaction transaction2 = db.getSession().getTransaction();
- transaction1.begin();
- transaction2.begin();
原因就是一个 session 不能同时开启多个 transaction。
上图说明的问题:
问题:假如一个 transaction.commit() 方法提交了 2 条 sql,但是第 2 条由于数据验证错误而抛了异常,那么请问,如果不手工调用 transaction.rollback() 方法,该 transaction 的第 1 条 sql 是否会执行成功。
答案:不会执行成功。这个结论告诉我们,如果之前没有调用 session.flush() 而是最后一起执行 transaction.commit(),那么不需要加 try-catch 来手工调用 transaction.rollback()
基于 spring mvc 搭建的多层级多模块 java web 应用程序框架。包含:基础设施层、数据库定义规范、数据库访问规范、日志记录规范、多层级异常捕获、标准 ajax 规范、母版页规范、视图呈现规范、JavaScript 框架规范等。实际上该框架定义的规范极其详细,比如数据库定义层:枚举类使用规范、datetime/bool/string 字段规范、1 对 1、1 对多、多对 1、多对多外键关系映射规范、父类定义规范、字段注释规范、懒加载规范等等。。。
技术交流 QQ 群:651499479,欢迎 java 大神指点迷津,也欢迎新手进群学习。
github 地址: https://github.com/leotsai/jframe
THE END.
来源: http://www.cnblogs.com/leotsai/p/hibernate-transaction-session-flush-commit-rollback.html