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。
JTA(Java Transaction API)事务
JTA:(Java Transaction API)Java事务API。是一个Java企业版的应用程序接口,在Java程序中,允许完成跨越多个XA资源的分布式事务。
- 隔离事务与底层的资源,实现透明的事务管理方式。
- 提供了跨数据库连接(或其他JTA资源)的事务管理能力。
- JTA事务管理由JTA容器实现。
- 一个JTA事务可以有多个参与者。
- 只是提供了一个接口,并没有提供具体的实现,而是由 j2ee服务提供商 根据JTS(Java Transaction Service:Java 事务服务)规范提供的。
标签:事务,Java,账户,API,分享,JTA,select 来源: https://blog.csdn.net/weixin_43839323/article/details/110453700