java中怎么控制事务的一致性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中怎么控制事务的一致性相关的知识,希望对你有一定的参考价值。

Java中为了控制事务的一致性,会使用插入回滚点、callback方法,保证数据不被篡改,示例如下:
public String delete(String id)
String ID = id;
 db = new getConnection();
 Connection con = db.getConnection();
 try
con.setAutoCommit(false);
db.executeUpdate("delete from helloworld where ID=" + ID); //更新操作1
  db.executeUpdate("delete from helloworld _book where ID=" + ID); //更新操作2
  db.executeUpdate("delete from helloworld_user where ID=" + ID); //更新操作3
  con.commit();//提交JDBC事务
  con.setAutoCommit(true);
db.close();
return “success”;
 
 catch (Exception e)
  con.rollBack();//回滚JDBC事务
  e.printStackTrace();
db.close();
return “fail”;
  
参考技术A 不用控制.事务全部成功就一起提交,有一个失败就回滚.这样就保证事务一致性了.本回答被提问者和网友采纳 参考技术B 有看情况, 一般是自动提交, 你也可以 手动 自己控制, 有一个失败,提交就失败了 参考技术C 使用spring的aop 参考技术D Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。
1、JDBC事务
JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。 java.sql.Connection 提供了以下控制事务的方法:
public void setAutoCommit(boolean)
public boolean getAutoCommit()
public void commit()
public void rollback()
使用 JDBC 事务界定时,您可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。

2、JTA(Java Transaction API)事务
JTA是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。
JTA允许应用程序执行分布式事务处理--在两个或多个网络计算机资源上访问并且更新数据,这些数据可以分布在多个数据库上。JDBC驱动程序的JTA支持极大地增强了数据访问能力。
如果计划用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。
您将需要用应用服务器的管理工具设置 XADataSource 。从应用服务器和 JDBC 驱动程序的文档中可以了解到相关的指导。
J2EE 应用程序用 JNDI 查询数据源。一旦应用程序找到了数据源对象,它就调用 javax.sql.DataSource.getConnection() 以获得到数据库的连接。
XA 连接与非 XA 连接不同。一定要记住 XA 连接参与了 JTA 事务。这意味着 XA 连接不支持 JDBC 的自动提交功能。同时,应用程序一定不要对 XA 连接调用 java.sql.Connection.commit() 或者 java.sql.Connection.rollback() 。
相反,应用程序应该使用 UserTransaction.begin()、 UserTransaction.commit() 和 serTransaction.rollback() 。

3、容器事务
容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。相对编码实现JTA事 务管理,我们可以通过EJB容器提供的容器事务管理机制(CMT)完成同一个功能,这项功能由J2EE应用服务器提供。这使得我们可以简单的指定将哪个方 法加入事务,一旦指定,容器将负责事务管理任务。这是我们土建的解决方式,因为通过这种方式我们可以将事务代码排除在逻辑编码之外,同时将所有困难交给J2EE容器去解决。使用EJB CMT的另外一个好处就是程序员无需关心JTA API的编码,不过,理论上我们必须使用EJB。

总结:
事务控制是构建J2EE应用不可缺少的一部分,合理选择应用何种事务对整个应用系统来说至关重要。一般说来,在单个JDBC 连接连接的情况下可以选择JDBC事务,在跨多个连接或者数据库情况下,需要选择使用JTA事务,如果用到了EJB,则可以考虑使用EJB容器事务。

事务隔离怎么保证

一、什么是事务

  事务:在数据库操作中事务就是一条或者多条SQL语句组成的一个不可分割的工作单元。

  特点:在事务当中的所有操作都正常完成时,整个事务才被提交到数据库当中,如果有一项操作没有完成,那么整个事务会被回滚。

二、事务的四大特性(ACID)

  A : 原子性:

    同一个事务中可能有多条sql语句,要么全部成功,要么直接回滚

  C : 一致性:

    事务中操作的数据以及状态改变是一致性的,即写入的结果必须完全符合预设的规则,不会出现系统意外等原因导致状态不一致。

  I : 隔离性:

    一个事务所操作的数据在提交之前,对其他的事务的不可见

  D : 持久性:

    事务所做的修改会永久保存,不会因为系统意外导致数据丢失。

三、事务的隔离性

  1、隔离性解决三大问题

    脏读 —— 还未提交的数据被读取出来

    不可重读——前后读取数据库的内容不一致

    幻读——前后读取数据库的总量不一致

  2、隔离级别

    RU——读未提交 : 会出现: 脏读,不可重读,幻读

    RC——读已提交: 防止脏读,会出现 不可重读和幻读

    RR——可重复读: 防止脏读,不可重复读,可能会出幻读 (默认级别)

    SR——串行化: 什么都能防止(多个会话窗口同步,不能并发,性能差)

四、怎么保证隔离性?

  1、多版本并发控制(mvcc)(防止不可重复现象)

    ReadView——ReadView其实就是快照,每个事务在启动后第一次执行查询时会创建一份快照

  2、锁(解决了幻读问题

    Gap Locks(间隙锁)——在索引记录之间加锁,或者在第一个索引记录之前加锁,或者在最后一个索引记录之后加锁

    Next-Key Locks(下一键锁)——在索引记录上加锁,并且在索引记录之前的间隙加锁

 

以上是关于java中怎么控制事务的一致性的主要内容,如果未能解决你的问题,请参考以下文章

事务是啥?在java中如何手工执行事务

[4]Java开发实习面试打卡

[4]Java开发实习面试打卡

分布式事务数据最终一致性之serviceComb-Saga使用方法

[4]Java开发实习面试打卡

事务控制