编程中的事务

事务的本质

事务的简介

事务机制是可以保证一系列写操作要么全部完成,要么全部不会完成,不会发生只完成一系列中一两个写操作,事务机制缺省一般由数据库完成,也可以通过应用程序实现(如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.youkuaiyun.com/qq_38724991/article/details/76176607]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值