首页编程java编程java中事务会因为什么回滚 事务的提交和回滚是什么意思 Java

java中事务会因为什么回滚 事务的提交和回滚是什么意思 Java

编程之家2023-10-14105次浏览

大家好,今天来为大家解答java中事务会因为什么回滚这个问题的一些问题点,包括事务的提交和回滚是什么意思 Java也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

java中事务会因为什么回滚 事务的提交和回滚是什么意思 Java

事务的提交和回滚是什么意思 Java

一组业务整体处理的行为叫一个事务。这一组的业务都能成功处理,我们就可以把这个事务提交来保存你已做的行为结果。但如果一组中有任何的差错出现的话,我们就认为这事务不成功,需要回滚来撤消之前的操作。举例:你去银行转账,转账我们有两步吧,从你账户中取出钱再往他账户中加钱。那这两步银行是必须要确保正确无误的进行的。要被看做成一个事务。其中任何一步出错就算是转账失败,但可能你这时是已经从你账户中扣了钱了,又没往他账户里加钱?怎么办算了?你不肯吧。所以银行会事务回滚,不保存你刚才的操作,即恢复到你没转账之前的状态。累啊

java方法 throws exception 后事务能回滚吗

使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作。

那么什么是检查型异常什么又是非检查型异常呢?

java中事务会因为什么回滚 事务的提交和回滚是什么意思 Java

最简单的判断点有两个:

1.继承自runtimeexception或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类)。

2.对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。所以必须在service捕获异常,然后再次抛出,这样事务方才起效。

java中事务会因为什么回滚 事务的提交和回滚是什么意思 Java

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)的理由。在使用一个中间层服务器时,就由该服务器负责保持事情正常。

sql中什么是事务啊

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。

事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。

扩展资料

事务类型

(1)手动事务

手动事务允许显式处理若干过程,这些过程包括:开始事务、控制事务边界内的每个连接和资源登记、确定事务结果(提交或中止)以及结束事务。

(2)自动事务

.NET页、XML Web services方法或.NET Framework类一旦被标记为参与事务,它们将自动在事务范围内执行。您可以通过在页、XML Web services方法或类中设置一个事务属性值来控制对象的事务行为。

OK,本文到此结束,希望对大家有所帮助。

明治维新时间 明治维新时间内容java什么叫接口的回调,Java中什么是接口回调