1、事务java
(1)事务(Transaction),通常是指要作的或所作的事情。在计算机术语中是指访问并可能更新数据库中各类数据项的一个程序执行单元(unit)。git
(2)事务应该具备4个属性:原子性、一致性、隔离性、持久性。这四个属性一般称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工做单位。好比A向B转帐1000元,那么这就必定要保证原子性(要么同时成功,要么同时失败)。github
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另外一个一致性状态,一致性与原子性是密切相关的。好比A向B转帐,不可能A扣了钱,B却没收到(这就是非一致性)。数据库
隔离性(isolation)。一个事务的执行不能被其余事务干扰。即一个事务内部的操做及使用的数据对并发的其余事务是隔离的,并发执行的各个事务之间不能互相干扰。好比A和C同时向B转帐,那B同一时间只能和一我的交易(同时只能有一个交易在执行)。session
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其余操做或故障不该该对其有任何影响。A向B转帐,成功之后B的帐户就存入了转帐数额,在不作其余的操做前提下数据是永久性的。并发
2、Hibernate事务处理框架
(1)Hibernate事务处理分布式
在Hibernate框架中,使用Transaction接口来维护了事务实现(JTA,JDBC)的抽象。
事务与Session相关联,并经过调用session.beginTransaction()实例化。atom
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; }
3、分布式事务
(1)JTA
在应用系统数据量愈来愈大时,系统数据就须要分布在不一样的数据库中,当业务需求在多个数据库中作原子性操做时就能够选择JTA (Java Transaction API),JTA事务比JDBC事务更强大。一个JTA事务能够有多个参与者,而一个JDBC事务则被限定在一个单一的数据库链接。
(2)JTA原理
不一样的数据库有不一样的数据库供应商,JTA就是将这个不一样的数据库管理起来,统一建立一个原子事务,所有成功即成功,一个不成功就回滚全部的操做(JTA仍是较重量级)
(3)实例
Spring有不少的JTA框架,这里使用的是atomikos框架,具体代码请点击连接查看
4、分布式消息最终一致性事务
(1)最终一致性
当应用系统数据愈来愈庞大,最终数据的一致性成为了一个很好的解决方案,即能即时响应,又能很好的完成多个数据操做(但不能保证必定成功,可能过了一段时间最终却没有成功)。
(2)实现原理当应用收到请求,应用会先将用户请求的数据保存到分布式消息中间件中,作一个保存操做。保存成功后就给用户返回提交成功信息。接着分布式消息中间件将请求在发送到不一样的处理机器上,处理机器收到消息在进行业务处理。好比A给B转帐,A先提交转帐信息(已经扣款),而后消息被发送的分布式消息中间件上,消息中间件在发送处处理机器上面作处理,转帐成功后则在给用户发送转帐成功信息,不成功则把款退回去。