事务的本质
事务的简介
事务机制是可以保证一系列写操作要么全部完成,要么全部不会完成,不会发生只完成一系列中一两个写操作,事务机制缺省一般由数据库完成,也可以通过应用程序实现(如Java的JTA等)
事务的特性
ACID
A:atomicity 原子性
C:consistency 一致性
I: isolation 隔离性
D: durability 持久性
事务的几种实现
1.jdbc事务:
conn.setTransactionIsolation(Connection.TRANSACTION_NONE);//没有事务
conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);//不提交读,会产生脏读
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);//提交读,会产生幻读
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);//可重复读,
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);//序列化读,可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率。
脏读:
A事务读取了B事务还没有提交的数据,当B事务回滚的时候,A就会出错。
不可重复读:
不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。
事务1:查询一条记录
————–>事务2:更新事务1查询的记录
————–>事务2:调用commit进行提交
事务1:再次查询上次的记录
*此时事务1对同一数据查询了两次,可得到的内容不同,称为不可重复读
幻读:
幻读,和不可重复读,都是多个事务的竞争关系。然而,不可重复读,是update和delete的操作锁,是行级别的,然而幻读主要是insert操作的全表锁级别的。
2.JTA事务:
解决什么问题: JTA事务主要解决分布式事务,一般高可用系统使用的少一些。
JTA编程的基本步骤
a、首先配置JTA ,建立相应的数据源
b、建立事务:通过创建UserTransaction类的实例来开始一个事务。代码如下:
Context ctx = new InitialContext§ ;
UserTransaction trans = (UserTransaction) ctx.lookup(“javax. Transaction.UserTransaction”)
c、开始事务:代码为 trans.begin() ;
d、找出数据源:从Weblogic Server上找到数据源,代码如下:
DataSource ds = (DataSource) ctx.lookup(“mysqldb") ;
e、建立数据库连接:Connection mycon = ds.getConnection() ;
f、执行SQL操作:stmt.executeUpdate(sqlS);
g、完成事务:trans.commit(); / trans.rollback();
h、关闭连接:mycon.close() ;
3.容器事务
容器事务主要是J2EE应用服务器提供的,容器事务大多是基于JTA完成,这是一个基于JNDI的,相当复杂的API实现。相对编码实现JTA事务管理,我们可以通过EJB容器提供的容器事务管理机制(CMT)完成同一个功能,这项功能由J2EE应用服务器提供。这使得我们可以简单的指定将哪个方法加入事务,一旦指定,容器将负责事务管理任务。这是我们土建的解决方式,因为通过这种方式我们可以将事务代码排除在逻辑编码之外,同时将所有困难交给J2EE容器去解决。使用EJB CMT的另外一个好处就是程序员无需关心JTA API的编码,不过,理论上我们必须使用EJB.
4.三种Java事务差异
1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
5、总结
Java事务控制是构建J2EE应用不可缺少的一部分,合理选择应用何种事务对整个应用系统来说至关重要。一般说来,在单个JDBC 连接连接的情况下可以选择JDBC事务,在跨多个连接或者数据库情况下,需要选择使用JTA事务,如果用到了EJB,则可以考虑使用EJB容器事务。
参考:幻读和不可重复读的区别[https://www.cnblogs.com/itcomputer/articles/5133254.html]
参考:容器事务[https://blog.csdn.net/qq_38724991/article/details/76176607]