jdbc事务(JAVA JDBC事务提交的疑问)

2024-07-08 04:12:53 3

jdbc事务(JAVA JDBC事务提交的疑问)

本文目录

JAVA JDBC事务提交的疑问

》》启动事务 conn.setAutoCommit();这个不是启动事务,而是设置事务是否自动提交,默认是自动提交,如果要手动控的话,写成conn.setAutoCommit(false);if(rs.next){ 》》》 ...执行更新 conn.commit(); }这个也不对,RS不可能执更新操作。只能是查询。如果你进行了锁表操作,那么如果没有commit()或rollbak()方法,是不会进行解锁操作的。下面给你些代码段以做参考。public class SQLCondition{ public ResultSet execuQuery(Connection conn) throws SQLException{ 检索操作.......} public int execuUpdate(Connection conn) throws SQLException{ 更新操作.......}}public class DBAccess(){ public void execute(){ SQLCondition condition = .....; Connection conn = .....; try{ conn.setAutoCommit(false); //设成非自动提交 condition.execuQuery(conn); condition.execuUpdate(conn); //如果操作成功会走到这一步,进行提交,可以解锁 conn.commit(); }catch(SQLException){ //出现任何的SQL异常都可以捕捉到,进行事务回滚,也可以解锁。 conn.rollbak(); } }}》》自动默认是回滚事务? 默认的话,是执行一条就进行提交,如果错了会回滚。

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) { 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{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最终的实现代码。 关于“两步提交协议”,可以参看下面的文章: ***隐藏网址***两阶段提交(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)的理由。在使用一个中间层服务器时,就由该服务器负责保持事情正常。

Spring JPA无法提交jdbc事务的解决办法

项目中使用了spring jpa与spring jdbc但在实际使用中发现spring jdbc中的事务没有被提交到,处理方式主要有以下几点 1. 确保工程中启用了事务 2.确保在方法上添加了事务注释 ***隐藏网址*** 系统中指定了JpaTransactionManager但没有指定JpaDialect,如果不指定默认给的是DefaultJpaDialect,而DefaultJpaDialect中并不会对JdbcConnection做处理,所以就导致了jdbc事务无法提交,解决办法也比较简单手动指定jpaDialect为HibernateJpaDialect;

网页显示无法打开JDBC连接事务;嵌套异常java.sql.SQLException:无法连接、 如何处理这种问题

这种情况一般是数据库连接串有问题,没设置对,或者连接池用户数已经满都可能出现无法链接的问题。 如果链接正常,而仅仅在做事务处理的时候有异常。可能的情况:你的当前数据库链接在已经启动一个事务,未提交的情况下,又开启了一个新的事务。造成要操作的数据表锁定。如果数据链接正常的话,楼主要给出更详细的信息才能判断。。

jdbc事务处理,设置了手动提交为何还会自动提交

事务处理的底层还是数据库内的commit和rollback,当你在plsql中或是navicat中,对一张表进行增删改操作后,直接关闭了查询窗口,这时默认给你提交,如果你直接关闭plsql中或是navica,则会rollback.类似于上面,你已经手动设置为false了,事务不会自动commit,程序正常流程下也不会处理异常,程序执行完提交了,而这就类似于正常的关闭查询窗口;所以自动提交了

jdbc事务(JAVA JDBC事务提交的疑问)

本文编辑:admin

更多文章:


in consequence(due to和in consequence of的区别)

in consequence(due to和in consequence of的区别)

本文目录due to和in consequence of的区别as a consequece of和in consequence of 有什么区别consequence的用法consequence 和result有什么区别in conseq

2023年9月26日 01:20

pdb文件详解(pdb的手册)

pdb文件详解(pdb的手册)

大家好,如果您还对pdb文件详解不太了解,没有关系,今天就由本站为大家分享pdb文件详解的知识,包括pdb的手册的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录pdb的手册pdb是什么pdb的文件组成pdb的手册P

2024年8月19日 23:15

engineering failure analysis(给engineering failure analysis投稿多次不成功,是什么问题)

engineering failure analysis(给engineering failure analysis投稿多次不成功,是什么问题)

本文目录给engineering failure analysis投稿多次不成功,是什么问题公司的官职级别的英语半导体失效分析工程师(failure analysis engineer)的职业发展前景怎么样待遇如何Failure Analy

2023年12月3日 14:20

php连接数据库增删改查教程(php 如何操作access数据库, 关于增删改查的四种操作)

php连接数据库增删改查教程(php 如何操作access数据库, 关于增删改查的四种操作)

大家好,今天小编来为大家解答以下的问题,关于php连接数据库增删改查教程,php 如何操作access数据库, 关于增删改查的四种操作这个很多人还不知道,现在让我们一起来看看吧!本文目录php 如何操作access数据库, 关于增删改查的四

2024年8月1日 17:50

root localhost(root@localhost 这个localhost是什么意思)

root localhost(root@localhost 这个localhost是什么意思)

各位老铁们好,相信很多人对root localhost都不是特别的了解,因此呢,今天就来为大家分享下关于root localhost以及root@localhost 这个localhost是什么意思的问题知识,还望可以帮助大家,解决大家的一

2024年9月1日 01:55

dim函数什么意思(matlab新手:dim是什么意思)

dim函数什么意思(matlab新手:dim是什么意思)

本文目录matlab新手:dim是什么意思fortran90中dim什么意思vb中dim、stastic、public有什么区别矩阵论dim是什么意思matlab 中max(x,[],dim)理解asp中的dim是什么vb中dim和priv

2024年7月11日 18:52

c语言是大学生都要学吗(C语言是大学的必修课吗)

c语言是大学生都要学吗(C语言是大学的必修课吗)

本文目录C语言是大学的必修课吗大学生真的有必要考二级c语言吗是每个大学学计算机的学生都要学C语言吗大学都什么专业需要学习C语言学到什么程度为什么很多专业都要学习 C 语言,大学生都要会编程吗大学生都要学c语言吗C语言是大学的必修课吗C语言不

2023年9月12日 03:20

数据库和数据库系统的相同(数据、数据库、数据库系统的区别)

数据库和数据库系统的相同(数据、数据库、数据库系统的区别)

本文目录数据、数据库、数据库系统的区别数据库和数据库系统有什么区别数据仓库跟数据库有什么异同点什么是数据库、数据库管理系统和数据库系统他们三者之间的关系数据、数据库、数据库系统的区别  数据的四个基本概念  数据  数据是数据库中存储的基本

2024年5月10日 06:34

git和svn的区别(svn和git的区别)

git和svn的区别(svn和git的区别)

本文目录svn和git的区别eclipse的git 插件和svn插件有什么区别对比版本控制利器Git和SVN的不同点git和SVN的区别,有必要学习git流程以及与SVN区别ios git 和svn的区别svn和git的区别面试git和sv

2024年6月6日 21:01

oracle数据库客户端(如何避免oracle数据库的端口在公网开放,又可以让客户端访问数据库)

oracle数据库客户端(如何避免oracle数据库的端口在公网开放,又可以让客户端访问数据库)

本文目录如何避免oracle数据库的端口在公网开放,又可以让客户端访问数据库如何在windows系统上安装oracle数据库怎么安装oracle的客户端怎样安装oracle数据库服务器oracle数据库和客户端有安装顺序吗oracle12g

2023年7月11日 04:40

eventargs是什么(net framework 的eventargs类有何用途)

eventargs是什么(net framework 的eventargs类有何用途)

本文目录net framework 的eventargs类有何用途EventArgs 和 RoutedEventArgs什么区别c# 里 参数this,eventargs.empty表示什么意思net framework 的eventarg

2024年7月7日 05:03

impulse函数(单位冲激信号与单位脉冲函数有什么区别)

impulse函数(单位冲激信号与单位脉冲函数有什么区别)

“impulse函数”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看impulse函数(单位冲激信号与单位脉冲函数有什么区别)!本文目录单位冲激信号与单位脉冲函数有什么区别MATLAB中,脉冲函数δ用什么表示啊MATLAB中

2024年7月10日 10:17

django文件管理系统(django中怎么载入css等静态文件)

django文件管理系统(django中怎么载入css等静态文件)

大家好,今天小编来为大家解答以下的问题,关于django文件管理系统,django中怎么载入css等静态文件这个很多人还不知道,现在让我们一起来看看吧!本文目录django中怎么载入css等静态文件Django用户配置文件数据库的问题问题,

2024年7月12日 11:35

countifs和sum套用(如何同时使用countifs和sum计算数值)

countifs和sum套用(如何同时使用countifs和sum计算数值)

本文目录如何同时使用countifs和sum计算数值excel countif函数与sumif函数我用sumif和countifs组合公式,发现这个公式把如何同时使用countifs和sum计算数值=SUMPRODUCT((G2:G1000

2024年7月23日 07:29

删除的文件如何找回(如何恢复被删除的文件怎样可以恢复被删除的文件)

删除的文件如何找回(如何恢复被删除的文件怎样可以恢复被删除的文件)

本文目录如何恢复被删除的文件怎样可以恢复被删除的文件文件误删了该怎么恢复电脑删除的文件如何找回如何恢复被删除的文件怎样可以恢复被删除的文件1、电脑自带回收站找回:如果文件是误删除操作导致的。比如右键点击“删除”操作按钮不见的文件,找回不见的

2024年6月12日 15:20

送礼时写敬上与呈上有什么区别那种情况用敬上,那些情况又用呈上?请问”敬上”是什么意思,通常用在什么地方.谢谢

送礼时写敬上与呈上有什么区别那种情况用敬上,那些情况又用呈上?请问”敬上”是什么意思,通常用在什么地方.谢谢

本文目录送礼时写敬上与呈上有什么区别那种情况用敬上,那些情况又用呈上请问”敬上”是什么意思,通常用在什么地方.谢谢关于“敬上”的用法,请帮助敬上是什么时候用敬上一般用在哪里敬上在结尾的用法敬上这个词怎么用送礼时写敬上与呈上有什么区别那种情况

2024年6月30日 17:25

access数据库电子书(access 数据库)

access数据库电子书(access 数据库)

本文目录access 数据库access 数据库怎么才能在网络上实现多用户同时操作呀,请注意是“同时”!快崩溃了Access数据库教程的图书信息access 数据库总分字段这样输入:总分:数学+英语+计算机,然后在总分字段的条返辩件行上输入

2024年7月6日 04:52

c++语言中strlen怎么用(求C++ strlen函数的用法)

c++语言中strlen怎么用(求C++ strlen函数的用法)

大家好,关于c++语言中strlen怎么用很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于求C++ strlen函数的用法的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位

2024年7月8日 13:56

织梦栏目页模板(织梦系统怎样实现不同栏目页调用相同的模板注意是栏目页啊!不是列表页,样式是一样的!)

织梦栏目页模板(织梦系统怎样实现不同栏目页调用相同的模板注意是栏目页啊!不是列表页,样式是一样的!)

本文目录织梦系统怎样实现不同栏目页调用相同的模板注意是栏目页啊!不是列表页,样式是一样的!织梦:更改栏目模板后,生成还是原来的栏目织梦手机站栏目页点开后显示的是PC站模板dede(织梦)怎么绑定 栏目页模板织梦5.7模板 栏目页如何修改内容

2024年7月7日 02:49

button标签的onclick事件(一个button标签的onclick没写的话,它是怎么触发事件的)

button标签的onclick事件(一个button标签的onclick没写的话,它是怎么触发事件的)

本文目录一个button标签的onclick没写的话,它是怎么触发事件的如何在后台调用button控件的onclick事件HTML问题:一个button标签的onclick没写的话,它是怎么触发事件的C# Web 一个button组件的on

2024年7月12日 07:28

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2334
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1732
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1156
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1153
标签列表

热门搜索