Java笔记一:Java中的事务

事务

Transaction:指的是一组操作,里面包含许多个单一逻辑。只要有一个逻辑没有执行成功,那么都算失败。所有的数据都回归到最初的状态(回滚)

(个人理解:相当于创建了数据库的副本,先通过逻辑对副本进行操作,如果所有逻辑成功,提交事务,将副本数据覆盖至原数据库中。如果失败,则将副本数据回滚至初始,并不对原数据库数据产生影响。)

存在的意义?

为了确保逻辑的成功。例:银行转账

Java代码使用方式

通过conn.setAutoCommit(fasle)来关闭连接对象(connection conn)的事务自动提交设置。

事务针对的是连接对象Connection,比如两个connection对象中的事务互不干扰。

提交事务:conn.commit();  回滚事务:conn.rollback();

事务的特性(ACID)

  • 原子性

    指的是事务中包含的逻辑不可分割(即是需要所有逻辑全部通过才算成功)
  • 一致性

    指的是事务执行前后。数据的完整性(指逻辑成功后提交数据,或者失败后回滚数据,保持数据一致)
  • 隔离性

    指的是事务在执行期间不应该受到其他事务的影响。(就即是针对的是连接对象操作)
  • 持久性

    指的是事务执行成功,那么数据应该持久保存到磁盘上。(提交成功,存在数据库中)

事务的安全性问题

隔离级别(优先级从低至高):

    1.读未提交(Read Uncommitted)(引发:脏读):一个事务读到其他事务尚未提交的数据

    2.读已提交(Read Committed)(解决:脏读)(引发:不可重复读):一个事务读到其他事务已经提交的数据,前后读到的结果不一样

    3.可重复读(Repeatable Read)(解决:脏读,不可重复读)(未解决:幻读):可以让事务在自己的会话中重复读取数据,确保事务不受其他事务的影响,不会出现结果不一样的状况,显示的还是以前的数据。

    4.可串行化(也称可序列化)(Serializable)(最高级别屏蔽,解决所有问题):不过有一些缺点,只能单线执行。如果有一个列检的隔离级别设置为了串行化,那么谁先打开了事务,谁就有了先执行的权利,则需要将先开启的事务Commit(或rollback)后,其他事务才能继续执行(其他事务时间等待时间过长会自动关闭),也即是一个个事务执行,效率低。

PS:Mysql默认的隔离级别的是可重复读,Oracle默认的隔离级别是读已提交

效率(从高到低)

 读未提交 > 读已提交 > 可重复读 > 可串行化

拦截程度(从高到低)

 可串行化 > 可重复读 > 读已提交 > 读未提交

而如果不考虑隔离级别设置,那么会出现以下问题,无法保证事务的隔离性:



  • 脏读:一个事务读到另外一个事务还未提交的数据。

    不可重复读(重点在Update和Delete,无法锁定Insert):一个事务读到了其他事务提交的数据,造成了前后两次查询结果不一样,而一个事务中的数据需要是独立的,不受其他事务所影响。

    可重复读:可以让事务在自己的会话中重复读取数据,确保事务不受其他事务的影响,不会出现结果不一样的状况,显示的还是以前的数据。

    幻读(重点在Insert):一个事务读到了其他业务已提交的插入(Insert)数据,导致多次查询结果不一样。(例如:有A,B事务,A事务查询(或修改)所有Money为1的数据,B增加了一条Money为1的记录,B提交事务,A再查询,将获得前后不一样的结果集,如同出现幻觉)


  • 丢失更新:两个事务A,B,后提交的B事务,将A事务先提交的数据覆盖了,相当于丢失了A事务更新的数据。

    1.提交造成的数据丢失。

    2.回滚造成的数据丢失。

    解决方法

    悲观锁:认定丢失更新的情况一定会发生,所以应用了数据库层的锁机制(排他锁)(select * from bank for update),锁定了此次事务中检索出符合条件的数据,外界无法修改这些数据,在当前事务结束后,才解锁。

    乐观锁:程序员手动为表添加一个version(版本号)标识,事务提交时对version加一。提交时将事务中version与表中version比较,当事务中的version的值大于表中的version值时,则予以更新,否则认为是过期数据,需要事务重新获取数据处理。(PS:基于系统中的数据存储逻辑,也就是由程序员自身控制)。

事务总结

1.代码中使用事务

Connection conn = new Connection();//建立连接
conn.setAutoCommit(fasle);//关闭事务自动提交,相当于开启事务

conn.commit();//提交
conn.rollback();//回滚

2.事务只是针对连接对象,不同的Connection对象互不影响。

3.连接对象的默认事务是会自动提交的,如果不关闭自动提交。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值