Java事务详解

什么是事务

要求MySQL的表类型为Innodb才支持事务。

在数据库操作中,一项事务是指由一条或多条对数据库更新的sql语句所组成的一个不可分割的工作单元。只有当事务中的所有操作都正常完成了,整个事务才能被提交到数据库,如果有一项操作没有完成,就必须撤消整个事务。 

例如在银行的转帐事务中,假定张三从自己的帐号上把1000元转到李四的帐号上,相关的sql语句如下: 
update account set monery=monery-1000 where name='zhangsan' 
update account set monery=monery+1000 where name='lisi' 
这个两条语句必须作为一个完成的事务来处理。只有当两条都成功执行了,才能提交这个事务。如果有一句失败,整个事务必须撤消。 

事务的特点

事务的四大特性:ACID

  • Atomic原子性:事务中的操作要么都成功,要么都失败;
  • Consistency一致性:事务前后,数据库的状态是正确一致的。例如,张三转给李四100元钱,转账操作后,系统的状态应该是张三少100元,李四多100元,系统的状态是正确的;
  • Isolation隔离性:隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
  • Durability持久性:事务结束后,状态应当是稳定的,不能被回滚;

事务的隔离级别

数据库为事务的隔离性提供了不同等级的隔离策略,来应对事务并发所产生的数据问题。并发事务可能产生的现象:

脏读

一个事务读取另一个未提交的事务的数据。导致前后读取的结果不一致。例如:

用户A向用户B转账100元,对应SQL命令如下

1. update account set money=money+100 where name=’B’;  (此时A通知B)
2. update account set money=money - 100 where name=’A’;

当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交&

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做IT的小伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值