“Spring 用到的实际上是事务上下文模式,把事务的边界定为业务层,也就是一个业务逻辑作为一个事务的整体,
当然了这个业务逻辑方法还可以调用其他的业务逻辑方法,每个业务逻辑方法可以调用若干 DAO 方法与数据库
进行交互。
Spring 在 AOP 中开启事务,接着调用方法,方法调用完成后提交事务,出现异常时回滚事务。具体的切入点在
方法调用前、方法调用后和抛出异常时等三处。
我对 Spring 不熟,在这里只能谈一下我的观点。
要想把多个 DAO 中的 JDBC Connection 对象纳入一个事务中,那么 Connection 就不能由 DAO 来管理,也就是
说事务的边界不能放在 DAO 层中,得把事务边界定在业务层中,这样才可以保证一个业务逻辑是原子性的。这样
的话就得保证所调用一个业务逻辑中所有的 DAO 方法都是共用一个 Connection 的,这样才能保证将这些 DAO
操作纳入到一个事务当中。DAO 的 Connection 一般从 ThreadLocal 这个类中获得,这样可以保证同一个线程使
用同一个 Connection。而 ThreadLocal 中的 Connection 是使用 AOP 的方式在调用方法之前就已经处理好的了,
而且其中的 Connection 已经关闭了自动提交功能,这样的话就可以将一个业务方法作为事务的边界启用事务了。
当然了,业务逻辑中的业务方法是不能直接让调用者来管理的,必须让某一个程序(容器)来管理,这样才有可
能使用 AOP 的代理对象。
实际上这里面的东西相当复杂,比如说,A,B,C 三个业务逻辑方法,每个方法中有若干个 DAO 操作,A 方法中
使用到了 B 和 C 方法,如果单独调用 B 或者 C 方法时在调用完后是提交事务的,但是调用 A 方法时,B 和 C
中的事务得合并到 A 中的事务中去,并不能执行完 B 或者 C 后就直接提交了。”
Spring 用到的实际上是事务上下文模式,把事务的边界定为业务层,也就是一个业务逻辑作为一个事务的整体,
当然了这个业务逻辑方法还可以调用其他的业务逻辑方法,每个业务逻辑方法可以调用若干 DAO 方法与数据库
进行交互。
Spring 在 AOP 中开启事务,接着调用方法,方法调用完成后提交事务,出现异常时回滚事务。具体的切入点在
方法调用前、方法调用后和抛出异常时等三处。
我对 Spring 不熟,在这里只能谈一下我的观点。
要想把多个 DAO 中的 JDBC Connection 对象纳入一个事务中,那么 Connection 就不能由 DAO 来管理,也就是
说事务的边界不能放在 DAO 层中,得把事务边界定在业务层中,这样才可以保证一个业务逻辑是原子性的。这样
的话就得保证所调用一个业务逻辑中所有的 DAO 方法都是共用一个 Connection 的,这样才能保证将这些 DAO
操作纳入到一个事务当中。DAO 的 Connection 一般从 ThreadLocal 这个类中获得,这样可以保证同一个线程使
用同一个 Connection。而 ThreadLocal 中的 Connection 是使用 AOP 的方式在调用方法之前就已经处理好的了,
而且其中的 Connection 已经关闭了自动提交功能,这样的话就可以将一个业务方法作为事务的边界启用事务了。
当然了,业务逻辑中的业务方法是不能直接让调用者来管理的,必须让某一个程序(容器)来管理,这样才有可
能使用 AOP 的代理对象。
实际上这里面的东西相当复杂,比如说,A,B,C 三个业务逻辑方法,每个方法中有若干个 DAO 操作,A 方法中
使用到了 B 和 C 方法,如果单独调用 B 或者 C 方法时在调用完后是提交事务的,但是调用 A 方法时,B 和 C
中的事务得合并到 A 中的事务中去,并不能执行完 B 或者 C 后就直接提交了。
InputStream is = new FileInputStream("applicationContext.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);
UserManager userManager = (UserManager )factory.getBean(" baseTxProxy ");
user = new Tuser();
article = new Article();
user.setUsername("hellboys_topic 1");
user.setPassword("12345678_topic 1");
article.setTitle("hellboys_topic 1");
article.setContent("hellboys_topic 1");
userManager.saveUserAndArticle(user,article);
InputStream is = new FileInputStream("web.xml");
XmlBeanFactory factory = new XmlBeanFactory(is);
UserManager userManager = (UserManager)factory.getBean("baseTxProxy");
user = newTuser();
article = new Article();
user.setUsername("fasdf");
userManager.saveUserAndArticle(user,article);