编程语言
首页 > 编程语言> > Java中的事务(学习分享)

Java中的事务(学习分享)

作者:互联网

文章目录

事务

介绍

什么是事务?

一般是指要做的或所做的事情。

在计算机中是指
访问并可能更新数据库中各种数据项的程序执行单元(unit)。
事务通常是由数据库操纵语言或者编程语言(如SQL、Java、C++)书写的用户程序执行所引起的。
事务的组成
事务开始(begin transaction)和事务结束(end transaction)之间执行的全部操作。
通常是以begin transaction开始,以commit(提交)或rollback(回滚)结束。

为什么使用事务?

事务是为解决数据安全操作提出来的,事务控制实际上就是控制数据的安全访问

举例论证:

  • 银行转账业务,账户A要将自己账户上的1000元转到账户B下,A账户余额首先要减去1000元,然后B账户要增加1000元。假如在中间网络出现了问题,A账户减去1000元已经结束,B账户因为网络中断而操作失败,这时的业务失败,那么就要做出控制,要求A账户的转账业务取消,这样才能保证业务的正确性,这时的操作就需要事务了,将A账户余额减少和B账户余额增加放在同一个事务里,要么全部执行成功,要么全部撤销,这样做就保证了数据的安全性。

事务有那些特性(ACID原则)

  • 原子性(atomicity):事务是数据库的逻辑工作单元,并且必须是原子工作单位,对于数据的修改,要么全部执行,要么全部不执行。
    总结:事务执行过程中的任何失败都将导致事务所做的任何修改失效。
  • 一致性(consistency):事务在完成时,必须是所有的数据都保持一致状态。数据库中所有的规则都必须应用于事务的修改以保证数据的完整性。
    总结:当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
  • 隔离性(isolation):一个事务的执行不能被其他事务影响。
    总结:事务执行过程中对数据的修改在事务提交前对其他事务不可见。
  • 持久性(durability):一个事务一旦提交,该事务的操作便永久性的保存在了DB中。即使数据库故障了也不会丢失提交的事务操作。

事务并发处理可能出现的问题

  • 脏读(dirty read):一个事务读取了另一个事务尚未提交的数据。
  • 不可重复读(non-repeatable read):一个事物的操作导致另一个事务前后两次读到不同的数据。
  • 幻读(phantom read):一个事务的操作导致另一个事务前后两次查询的结果数据量不同。

举例:

事务A、B并发执行时:

  • 当A事务update后,B事务select读取到A尚未提交的数据,此时A事务rollback,则B读到的数据是无效的脏数据。
  • 当B事务select读取数据后,A事务update操作更改B事务select到的数据,此时B事务再次读取该数据,发现前后两次的数据不一样。
  • 当B事务select读取数据后,A事务insert或delete了一条满足A事务的select条件的记录,此时B事务再次select,发现查询到前次不存在的记录,或者前次的某个记录不见了。

事务的类型

Java的事务类型一般分为三类:

  • JDBC事务。
  • JTA(Java Transaction API)事务。
  • 容器事务。

JDBC事务

由Connection对象控制的。是Java后端程序与数据库连接的API。

更多JDBC事务内容可以点击这里查看另一篇文章

JTA(Java Transaction API)事务

JTA:(Java Transaction API)Java事务API。是一个Java企业版的应用程序接口,在Java程序中,允许完成跨越多个XA资源的分布式事务

  • 隔离事务与底层的资源,实现透明的事务管理方式。
  • 提供了跨数据库连接(或其他JTA资源)的事务管理能力。
  • JTA事务管理由JTA容器实现。
  • 一个JTA事务可以有多个参与者。
  • 只是提供了一个接口,并没有提供具体的实现,而是由 j2ee服务提供商 根据JTS(Java Transaction Service:Java 事务服务)规范提供的。

更多JTA事务的内容可以点击这里查看

标签:事务,Java,账户,API,分享,JTA,select
来源: https://blog.csdn.net/weixin_43839323/article/details/110453700