导航:首页 > 废水知识 > jdbc设置回滚点用

jdbc设置回滚点用

发布时间:2022-06-11 09:02:41

Ⅰ java中jdbc多表操作如何事物回滚

可以把要执行的四个SQL语句写到同一个List中再调用此方法
你也可以自己写
主要注意
执行sql插入前要取消自动提交
con.setAutoCommit(false);
全部sql语句执行完成后再提交
con.commit();
执行过程抛出异常则回滚
con.rollback();
希望对你有帮助
public
boolean
exeupdate(List<String>
sqls)
throws
SQLException
{
boolean
flag
=
false;
openPoolConnection();//创建连接
try
{
//
con.setAutoCommit(false);//取消自动提交
for(int
i=0;i<sqls.size();i++)
{
pstmt
=
con.prepareStatement(sqls.get(i));
int
rows
=
pstmt.executeUpdate();
}
flag
=
true;
con.commit();//提交
}
catch
(Exception
e)
{
con.rollback();//回滚
e.printStackTrace();
}
finally
{
this.closeAll();//关闭连接
数据集
语句对象
}
return
flag;
}

Ⅱ jdbc事务回滚java操作

事务控制,一起提交或回滚。
Connection
conn
=
....
//
取得数据库连接;
conn.setAutoCommit(false);
//
关闭自动提交;
try{
......
//
你的处理数据代码回.
conn.commit();
//
提交事务.
}catch(Exception
ex){
conn.rollback();
//
失败回滚答.
}

Ⅲ 在jdbc中回滚是什么意思

回滚必须要配合上事务。
在事务中如果正常执行就执行提交commit.如果中间出现问题,可以使用rollback()来撤销事务中所包含的所有操作。
所以一般都会把回滚放在catch中

Ⅳ 简答题 应用JDBC技术对如何保证多条SQL命令要么都成功,要么都失败。 求Java大神

如果JDBC连接处于自动提交模式,默认情况下,则每个SQL语句在完成后都会提交到数据库。

对于简单的应用程序可能没有问题,但是有三个原因需要考虑是否关闭自动提交并管理自己的事务 -

原文地址:网页链接

Ⅳ jdbc如何实现数据库跨库事务删除回滚的问题

1. Connection.setAutoCommit(boolean );//设置自动提交模式,false表示禁用自动提交模式;
2. 用Savepoint对象的setSavapoint(String name);
3 rollback()取消在当前事务中进行的所有更改;
4. rollback (Savepoint )//回退到保存点 状态;
5. commit ()提交事务;

Ⅵ java中的JDBC事务和JTA的区别是什么

在说他们之间的区别之前,先考虑如下几个问题:
1、getCurrentSession()与openSession()的区别?
* 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()
创建的session则不会
* 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()
创建的session必须手动关闭

2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
* 如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>

以上是hibernate中一些使用,下面来说说jdbc与jta的区别:
JDBC 事务
JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。
#在jdbc中,事务操作缺省是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作,操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回滚。
# 在jdbc中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调 用commit()来进行整体提交,倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生响应的异常;此时就可以在异常捕获时调用 rollback()进行回滚。这样做可以保持多次更新操作后,相关数据的一致性,示例如下:

try {

conn =

DriverManager.getConnection

("jdbc:oracle:thin:@host:1521:SID","username","userpwd";

conn.setAutoCommit(false);//禁止自动提交,设置回滚点

stmt = conn.createStatement();

stmt.executeUpdate(“alter table …”); //数据库更新操作1

stmt.executeUpdate(“insert into table …”); //数据库更新操作2

conn.commit(); //事务提交

}catch(Exception ex) {

ex.printStackTrace();

try {

conn.rollback(); //操作不成功则回滚

}catch(Exception e) {

e.printStackTrace();

}

}

JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。
JTA事务
JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。
要用 JTA 进行事务界定,应用程序要调用 javax.transaction.UserTransaction 接口中的方法。例如:
utx.begin();
// ...
DataSource ds = obtainXADataSource();
Connection conn = ds.getConnection();
pstmt = conn.prepareStatement("UPDATE MOVIES ...");
pstmt.setString(1, "Spinal Tap");
pstmt.executeUpdate();
// ...
utx.commit();

让我们来关注下面的话:
“用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。”
要使用JTA事务,必须使用XADataSource来产生数据库连接,产生的连接为一个XA连接。
XA连接(javax.sql.XAConnection)和非XA(java.sql.Connection)连接的区别在于:XA可以参与JTA的事务,而且不支持自动提交。
注意:
Oracle, Sybase, DB2, SQL Server等大型数据库才支持XA, 支持分布事务。
My SQL 连本地都支持不好,更别说分布事务了。
JTA方式的实现过程:
用XADataSource产生的XAConnection它扩展了一个getXAResource()方法,事务通过这个方法把它加入到事务容器中进行 管理.对于调用者来说,根本看不到事务是如果管理的,你只要声明开始事务,告诉容器我下面的操作要求事务参与了,最后告诉事务说到这儿可以提交或回滚了, 别的都是黑箱操作。
在使用JTA之前,你必须首先实现一个Xid类用来标识事务(在普通情况下这将由事务管理程序来处理)。Xid包含三个元素:formatID、gtrid(全局事务标识符)和bqual(分支修饰词标识符)。
下面的例子说明Xid的实现:

import javax.transaction.xa.*;
public class MyXid implements Xid
{
protected int formatId;
protected byte gtrid[];
protected byte bqual[];
public MyXid()
{
}
public MyXid(int formatId, byte gtrid[], byte bqual[])
{
this.formatId = formatId;
this.gtrid = gtrid;
this.bqual = bqual;
}

public int getFormatId()
{
return formatId;
}

public byte[] getBranchQualifier()
{
return bqual;
}

public byte[] getGlobalTransactionId()
{
return gtrid;
}

}
其次,你需要创建一个你要使用的数据库的数据源:
public DataSource getDataSource()
throws SQLException
{
SQLServerDataSource xaDS = new
com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource();
xaDS.setDataSourceName("SQLServer");
xaDS.setServerName("server");
xaDS.setPortNumber(1433);
xaDS.setSelectMethod("cursor");
return xaDS;
}

例1 这个例子是用“两步提交协议”来提交一个事务分支:
XADataSource xaDS;
XAConnection xaCon;
XAResource xaRes;
Xid xid;
Connection con;
Statement stmt;
int ret;
xaDS = getDataSource();
xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password");
xaRes = xaCon.getXAResource();
con = xaCon.getConnection();
stmt = con.createStatement();
xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
try {
xaRes.start(xid, XAResource.TMNOFLAGS);
stmt.executeUpdate("insert into test_table values (100)");
xaRes.end(xid, XAResource.TMSUCCESS);
ret = xaRes.prepare(xid);
if (ret == XAResource.XA_OK) {
xaRes.commit(xid, false);
}
}
catch (XAException e) {
e.printStackTrace();
}
finally {
stmt.close();
con.close();
xaCon.close();
}
当然,实际过程中,我们不需要写这些代码,这些代码是JTA最终的实现代码。
关于“两步提交协议”,可以参看下面的文章:
http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505weber/index.html

两阶段提交(Two-Phase-Commit)协议

首先,两阶段提交(Two-Phase-Commit)事务的启动与常规的单阶段提交(One-Phase-Commit)事务类似。接着,应用程序/客 户机对该两阶段提交(Two-Phase-Commit)操作中所涉及的所有数据库执行其修改工作。现在,在最终提交该事务之前,客户机通知参与的数据库准备提交(第 1 阶段)。如果客户机从数据库收到一条“okay”,就发出命令向数据库提交该事务(第 2 阶段)。最后分布式事务(Distributed Transaction)结束。

上面的例子演示了如何在 Java 中使用 JTA 实现两阶段提交(Two-Phase-Commit)协议。在该应用程序中,如果一个事务分支报告了错误,您就要负责进行错误处理。但是“两阶段提交协议 简介”小节中提到仍然存在一个问题,那就是如果第 2 阶段中一个事务分支发生故障,该怎么办呢?

如果再次查看程序代码,您可以看到在“第 1 阶段”和“第 2 阶段”之间有一个很小的时间间隔。在这一时间间隔中,出于某种理由,其中某一参与数据库可能崩溃。如果发生了,我们将陷入分布式事务已经部分提交的情形中。

假 定下列情形:在“第 1 阶段”之后,您从 DB2 和 IDS 数据库中都收到了“okay”。在下一步中,应用程序成功提交了 DB2 的事务分支。接着,应用程序通知 DB2 事务分支提交事务。现在,在应用程序可以通知 IDS 事务分支提交它这一部分之前,IDS 引擎由于断电发生崩溃。这就是一种部分提交全局事务的情形。您现在该怎么办呢?

在重启之后,DB2 和 IDS 都将尝试恢复打开的事务分支。该引擎等待来自应用程序的提示如何做。如果应用程序没有准备重新发送“第 2 阶段”的提交,该事务分支将被引擎所启动的试探性回滚中止。这是非常糟糕的,因为这将使该全局事务处于不一致状态。

一种解决方案是用一个小型应用程序连接引擎中打开的事务分支,并通知引擎提交或回滚这一打开的事务。如果您使用 IDS 作为后端,那么还有一个隐藏的 onmode 标志,允许您结束打开的事务分支。(onmode -Z xid)。

在 DB2 UDB 中,您可以发出 LIST INDOUBT TRANSACTIONS 来获得打开的 XA 事务的有关信息。您必须查看 DB2 Information Center 中的描述来解决该问题。

上面描述的情形是一个很好的例子,也是使用应用程序服务器(Application Server)或事务监控器(Transaction Monitor)的理由。在使用一个中间层服务器时,就由该服务器负责保持事情正常。

Ⅶ 关于jdbc中数据库事务的提交和回滚

首先,连接数据库异常,可能是数据库JDBC连接问题,也可能是驱动问题。
第二,没找到数据库
第三,数据库字段拼写错误。
第四,SQL语句错误
第五,还没发现。呵呵。这个是我最近2天遇到的问题。。。都在这里啦。。

Ⅷ JDBC事物回滚怎么不起作用

JDBC 事务不回滚?
有两种情况,先看 autoCommit(true),在JDBC规范中有这样一段描述:
Newly created Connection objects are in auto-commit mode by default, which means that indivial SQL statements are committed automatically when the statement is completed.

可看出,只要你的SQL 本身没有问题,JDBC就会自动提交,但是比如接入数据发生异常,抛出SQLException的时候事务不会回滚的。
所有通常会手工控制,但是这里还有一个坑,就是有些数据源,会使用代理模式,将真正的Connection 包裹起来(依据架构和组件的不同,可能会有很多层包裹),你需要getMeterConnection 后,在对元Connection设置AutoCommit ,否则无论你怎么写,轻者异常,重者不通知成为“悬案”。

如果你使用了JTA,事务不回滚,依然正常,JTA 不是所有的异常都回滚的,只有对unCheckException 才回滚,换句话说,只有对RuntimeException 或其子异常才回滚。

Ⅸ JDBC调用存储过程,存储过程中事务回滚,报错

ConnCloseThread中关闭连接的时候,不是立刻返回的。Connection.close()会触发Connection.commit(),而因为调用的存储过程中,存储过程起了自己的事务,connection.commit()必须等到存储过程结束才能完成(这个是microsoft论坛上看到的)。如果所有connection.close()都等到tx commit或rollback完成才执行的话,这个问题就不会出现了
从测试结果来看,凡是close connection耗时比execute statement短的,连接(物理连接)都会报出该问题。分析原因:通过weblogic datasource获取的connection并不是物理connection,而是由weblogic wrapped的connection。这些conection在被close后,并不会关闭物理连接,而只是将物理连接还池。我们对connection的所有操作,最终都会被delegated到底层物理连接上,即commit(),rollback()最终都是在物理连接上执行。如果上面的connection.close(),底层物理连接没有等到存储过程事务结束就返回的话,那么物理连接上应该还带有此次操作的事务,而weblogic这边不会关系物理连接的情况,直接将连接放入connection pool供其它客户端使用。这时候如果设定了test on reserve的话,下次客户端从data source获取连接时,weblogic会检查这个物理连接,作一个select操作的,这个有问题的连接就会暴露出来,也就是上面的异常。这个问题如果使用driver manager来获取连接的话(如果每次都关闭的话),则不会出现,因为使用的物理连接每次都是不同的。还好,weblogic会帮忙重新创建有问题的连接。原因大概了解了,但这是谁的问题呢? 为什么connection.close()不等存储过程的事务结束?

结论:一般而言,我们不建议通过JDBC调用存储过程的时候,在存储过程中定义事务,应该将tx的管理工作交给jdbc去做。 non-xa如此,xa亦如此,毕竟事务嵌套了以后,管理起来是个问题,完整性更是个问题。

Ⅹ jdbc 事务处理问题 提交 回滚

try {

conn =

DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","userpwd";

conn.setAutoCommit(false);//禁止自动提交,设置回滚点

stmt = conn.createStatement();

stmt.executeUpdate(“insert into table …”);

stmt.executeUpdate(“delete from table …”);

conn.commit(); //事务提交

}catch(Exception ex) {

ex.printStackTrace();

try {

conn.rollback(); //操作不成功则回滚

}catch(Exception e) {

e.printStackTrace();

}

}

阅读全文

与jdbc设置回滚点用相关的资料

热点内容
雨水井与污水井是不是相通的 浏览:980
2016款尼桑逍客空调滤芯怎么更换 浏览:571
云雾感的环氧树脂 浏览:171
小型家用蒸馏酒设备 浏览:117
辽阳室内净化器多少钱一台 浏览:87
污水处理厂联系方式同名单 浏览:723
污水厂除臭加罩 浏览:484
污水中氢离子含量应是多少达标 浏览:330
污水除泡剂怎么使用 浏览:921
反渗透膜论文 浏览:259
过滤净水器怎么放小苏打 浏览:684
反渗透出来的水是什么水 浏览:311
污水中的污泥怎么处理 浏览:625
奥克斯净化器怎么使用说明 浏览:408
长春污水厂建设 浏览:989
含油量对超滤膜通量的影响 浏览:336
福建古巴胶树脂 浏览:909
陶壶烧水会有水垢吗 浏览:80
西宁印染污水聚丙烯酰胺多少钱 浏览:709
污水处理如何降低水中色度 浏览:371