资讯专栏INFORMATION COLUMN

Java 事务详解

cyrils / 1552人阅读

摘要:一个事务的执行不能被其他事务干扰。持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。事务与相关联,并通过调用实例化。强制此事务回滚。为此事务注册用户同步回调。检查事务是否成功提交。

一、事务

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

(2)事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位。比如A向B转账1000元,那么这就一定要保证原子性(要么同时成功,要么同时失败)。

一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态,一致性与原子性是密切相关的。比如A向B转账,不可能A扣了钱,B却没收到(这就是非一致性)。

隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。比如A和C同时向B转账,那B同一时间只能和一个人交易(同时只能有一个交易在执行)。

持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。A向B转账,成功以后B的账户就存入了转账数额,在不做其他的操作前提下数据是永久性的。

二、Hibernate事务处理

(1)Hibernate事务处理

在Hibernate框架中,使用Transaction接口来维护了事务实现(JTA,JDBC)的抽象。
事务与Session相关联,并通过调用session.beginTransaction()实例化。

Transaction接口的方法如下:
void begin() 开始一个新的事务。
void commit() 结束工作单位,在FlushMode.NEVER中除外。
void rollback() 强制此事务回滚。
void setTimeout(int seconds) 它为由此实例开始的后续调用启动的任何事务设置事务超时。
boolean isAlive() 检查交易是否仍然存在。
void registerSynchronization(Synchronization s) 为此事务注册用户同步回调。
boolean wasCommited() 检查事务是否成功提交。
boolean wasRolledBack() 检查事务是否成功回滚。

(2)Hibernate事务绑定

Hibernate使用本地线程绑定事务(所以不能在一个线程中启动多个线程去操作不同的数据工作),当请求Service方法时打开通过Soring AOP 自动打开 Hibernate Session,启动事务,执行所有与数据相关的工作,结束事务并关闭Session。模式的关键是交易与交易之间的一对一关系 Session。

例子:

public Integer save(One one,Tow tow) {
    oneDao.save(one);
    towDao.save(tow);
    return 1;
}

三、分布式事务

(1)JTA
在应用系统数据量越来越大时,系统数据就需要分布在不同的数据库中,当业务需求在多个数据库中做原子性操作时就可以选择JTA (Java Transaction API),JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。

(2)JTA原理
不同的数据库有不同的数据库供应商,JTA就是将这个不同的数据库管理起来,统一创建一个原子事务,全部成功即成功,一个不成功就回滚所有的操作(JTA还是较重量级)

(3)实例
Spring有很多的JTA框架,这里使用的是atomikos框架,具体代码请点击链接查看

四、分布式消息最终一致性事务

(1)最终一致性
当应用系统数据越来越庞大,最终数据的一致性成为了一个很好的解决方案,即能即时响应,又能很好的完成多个数据操作(但不能保证一定成功,可能过了一段时间最终却没有成功)。

(2)实现原理
当应用收到请求,应用会先将用户请求的数据保存到分布式消息中间件中,做一个保存操作。保存成功后就给用户返回提交成功信息。接着分布式消息中间件将请求在发送到不同的处理机器上,处理机器收到消息在进行业务处理。比如A给B转账,A先提交转账信息(已经扣款),然后消息被发送的分布式消息中间件上,消息中间件在发送到处理机器上面做处理,转账成功后则在给用户发送转账成功信息,不成功则把款退回去。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71536.html

相关文章

  • 【大数据实践】Kafka生产者编程(1)——KafkaProducer详解

    摘要:从上述构造函数可以看出,可以通过和两种形式传递配置信息,用于构造对象,配置信息均为对。获取内部的和,用于后续该产生的事务性消息。该方法的返回值为该被发送到的分区的元数据,如偏移量,创建时间等。 前言 在文章【大数据实践】游戏事件处理系统系列文章中中,我们已经做到使用filebeat收集日志事件、logstash处理日志事件、发送日志事件到kafka集群,并在消费者中消费的过程。其中,为...

    yuanzhanghu 评论0 收藏0
  • 【大数据实践】Kafka生产者编程(1)——KafkaProducer详解

    摘要:从上述构造函数可以看出,可以通过和两种形式传递配置信息,用于构造对象,配置信息均为对。获取内部的和,用于后续该产生的事务性消息。该方法的返回值为该被发送到的分区的元数据,如偏移量,创建时间等。 前言 在文章【大数据实践】游戏事件处理系统系列文章中中,我们已经做到使用filebeat收集日志事件、logstash处理日志事件、发送日志事件到kafka集群,并在消费者中消费的过程。其中,为...

    shengguo 评论0 收藏0
  • 事务隔离级别(图文详解)

    摘要:事务隔离级别图文详解什么是事务事务是逻辑上的一组操作,要么都执行,要么都不执行。可串行化最高的隔离级别,完全服从的隔离级别。存储引擎在分布式事务的情况下一般会用到可串行化隔离级别。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。 该文已加入笔主的开源项目——JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目),地址:https://github.c...

    taowen 评论0 收藏0
  • 事务隔离级别(图文详解)

    摘要:事务隔离级别图文详解什么是事务事务是逻辑上的一组操作,要么都执行,要么都不执行。可串行化最高的隔离级别,完全服从的隔离级别。存储引擎在分布式事务的情况下一般会用到可串行化隔离级别。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。 该文已加入笔主的开源项目——JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目),地址:https://github.c...

    Gemini 评论0 收藏0
  • 可能是最漂亮的Spring事务管理详解

    摘要:事务隔离级别定义了一个事务可能受其他并发事务影响的程度我们先来看一下并发事务带来的问题,然后再来介绍一下接口中定义了五个表示隔离级别的常量。 Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,...

    邹立鹏 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<