1  con.setAutoCommit(false);// 更改JDBC事务的默认提交方式   
2  dbc.executeUpdate("delete from bylaw where ID=" + sID);   
3  dbc.executeUpdate("delete from bylaw _content where ID=" + sID);   
4  dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID);   
5  con.commit();//提交JDBC事务
问题:
1,第1条将jdbc提交方式改成事务提交后,2,3,4条更新数据库的时候,那些更新的sql语句放在哪儿呢,是放在Connection对象中,然后在调用commint()方法的时候提交给数据库吗
2,如果不是使用事务提交方式的时候,当执行2,3,4条的时候,sql语句放在哪儿呢
3,之所以是有上述问题,是因为不理解spring声明式事务,spring中在为某个方法声明一个事务后,如果使用的是jdbc事务管理器,那么这个jdbc事务管理器是如果从一个方法中获取相应的sql语句的呢

解决方案 »

  1.   

    spring里面的控制的con默认isautoCommit都是false,1  con.setAutoCommit(false);// 更改JDBC事务的默认提交方式  
    //开启事物
    2  dbc.executeUpdate("delete from bylaw where ID=" + sID);  
    3  dbc.executeUpdate("delete from bylaw _content where ID=" + sID);  
    4  dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID);  
    5  con.commit();//提交JDBC事务 
    //关闭事物如果没有申明spring的事物,请使用以上语句方式。
    如果申明spring的事物直接con.commit();//即可完成数据的操作
      

  2.   

    sql语句放在哪儿呢?这是什么意思
      

  3.   

    这问题,以前我也遇到过,我的解决方法是有点笨,不过还行得通..
    多条Sql语句更新时,我用方法调用.即是每一条SQl语句写一个特定的方法去实现.
      

  4.   

    无论 autoCommit状态怎么样2,3,4条语句都已经提交到数据库了,这个时候数据更不更新取决于数据库了。当数据库收到commit的时候就更新数据,没有commit就不改变
      

  5.   

    自动提交是数据库的属性,与java无关,java不会缓存sql
    在jdbc执行executeUpdate,就相当于在数据库执行了sql命令,不管你是否设置了自动提交
    如果设置了自动提交为true,执行了的sql马上生效,不然,处理数据会放在数据库的回滚段中,等待用户去commit或者rollback在java中执行con.setAutoCommit(true/false);
    相当于在db中执行:
    SET AUTOCOMMIT ON/OFF
      

  6.   


    1. 这些在commit之前都是针对当前的Connection进行的。 con.setAutoCommit(false);// 更改JDBC事务的默认提交方式  dbc.executeUpdate("delete from bylaw where ID=" + sID); 
     dbc.executeUpdate("delete from bylaw _content where ID=" + sID); 
     dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID);  
    添加一条:
    select ^^
    这个时候select 也能查到上面更改完的数据,不过其他的connnection中是查不到的,因为数据库中的数据并没有改变。还有就是  commit之前,del 已经执行了,所以sql语句应该也被销毁了。(这点不是非常确定 )
      

  7.   

    重新说清楚点
    问题1和问题2:无论语句1设置值是false还是true
    2,3,4条更新数据库的时候,那些更新的sql语句都提交到数据库了,
    数据库是否真执行取决于autocommit了,如果是true,就是每收到一条sql就立即执行,
    否则必须等到commit才真正执行,没有commit不执行。所以问题3也可以解释了,connection是不保留sql语句的,sql语句保存在数据库执行引擎中。
    spring的事物管理主要是保证整个事务是同一个connection就是了(当然JTA不是这样的)
      

  8.   

    我晕你。。你自己的不是将SQL写出来了吗?Spring根本就不管你的SQL,他只将你DB操作根据事物的性质来隔离(底层其实还是JDBC事物),所有的具体操作的SQL,都是你自己指定的,或则类似Hibernate的框架生成的。Spring只控制事物的步骤(这个词可能不确切),失败就回滚,否则就提交。至于具体怎能做 DB操作,都是你自己指定的啊。
      

  9.   

    事务是由数据库服务器控制的,本地是不需要存储SQL语句的。提交、回滚都是需要服务器支持的,JDBC只是将命令发送到数据库中
      

  10.   

    数据库API磁盘块调用只是把SQL语句当成字符串参数进行解析变成宿主程序。事务跟sql语句是两个体系。
      

  11.   

    对就像5楼说的。“多条Sql语句更新时,我用方法调用.即是每一条SQl语句写一个特定的方法去实现.”
    我也是用的。
      

  12.   

    事务是由数据库服务器控制的,
    本地是不需要存储SQL语句的。
    提交、回滚都是需要服务器支持的,JDBC只是将命令发送到数据库中你commit之后 数据库里面的值才改变 
      

  13.   

     在执行dbc.executeUpdate(“”);  语句后数据已经存在数据库了,在commit之前是否能看到数据库中的数据要看数据库的隔离级别了。
      

  14.   

    应该是设置自动提交时候 跟那位仁兄说的一样,数据库做了一个SET AUTOCOMMIT ON/OFF动作。剩下执行语句,就等着commit/rollback了。。
      

  15.   

    事务是由数据库服务器控制的,
    本地是不需要存储SQL语句的。
    提交、回滚都是需要服务器支持的,
    JDBC只是将命令发送到数据库中.
      

  16.   

    1,第1条将jdbc提交方式改成事务提交后,2,3,4条更新数据库的时候,那些更新的sql语句放在哪儿呢,是放在Connection对象中,然后在调用commint()方法的时候提交给数据库吗 
    2,如果不是使用事务提交方式的时候,当执行2,3,4条的时候,sql语句放在哪儿呢 
    答:其实这两个问题其实是一个意思。这些Sql都执行了,如果数据库的隔离级别设置成“未提交读”,那么可以查询到数据。只有事务提交了,才能正常看到,因为基本上所有数据库的隔离级别都是“已提交读”,如sqlserver2000,或是"可重复读",如mysql和oracle。
    3,之所以是有上述问题,是因为不理解spring声明式事务,spring中在为某个方法声明一个事务后,如果使用的是jdbc事务管理器,那么这个jdbc事务管理器是如果从一个方法中获取相应的sql语句的呢 
    答:参照11楼说的。