mysql开启事务 java_mysql事务

一、事务的简单介绍:

在mysql中,事务即是用户所定义的一系列的会对数据产生影响的行为,是数据库管理系统中执行过程中的一个逻辑单位,由一个有序的数据库操作单位构成。所谓的逻辑单位就是指它是数据库最小的工作单位,由一个有序的数据库操作序列所组成。

无论是直接使用@Transactional注解还是在xml中配置切面亦或是直接使用JDBC,我们都是希望操作能够一次性成功,而不会产生异常或者是回滚。比较常见的应用场景就是银行转账的例子,如果一个银行的账户减少而另外一个银行的账户增加,那么这两种情况的发生都因该是同时的,否则就会出现问题。又如12306的连续换乘系统,如果只买到前半程或者是后半程都是不成功的。

在Mysql里面,InnoDB是支持数据库事务的,并且提供了事务的四个特性:

1、原子性(Atomicity):也就是所说的不可再分,即一个操作要么全部成功,要么全部失败。全部成功是比较简单的,只要执行过程中不出现问题便会成功,而InnoDB引擎是如何确保全部失败的呢?在InnoDB引擎里面是通过日志来确保事务的原子性的。也就是undo log,一旦发生异常便是通过undo log来实现事务的回滚的。

2、隔离性(Isolation):事务的执行是互不干扰的,对表或者行的并发操作应该都是互不干扰的。

3、持久性(Durability):对数据库做的所有的操作只要是成功了,就是永久性的,不可能应为外在的原因如断电,宕机等而改变。持久性的实现是通过了Mysql Innodb引擎的redo log 和双写缓冲来实现的。

4、一致性(consistent):以上三点的最终的目的都是为了确保事务的一致性,事务的一致性是指数据库的完整性约束没有破坏,事务执行的前后都是合法的数据状态。

二、什么情况下会开启事务?

1、如下语句所示:

update student set name  = 'drainli' where id_card = 'xxxxx' ;

显然是开启了事务并且自动提交了,innodb引擎是默认开启了事务的自动提交的,并且开启事务的方式还有其他的办法,如begin ,start transaction .事务并发会带来一系列的问题。如脏读、不可重复度、幻读。脏读通过设置事务的隔离级别为读已提交即可解决,不可重复读设置事务的级别为可重复读即可解决,并且在innodb引擎中,可重复读可以解决mysql数据库事务的所有的问题,即能够解决脏读、不可重复读、幻读问题,因为mysql innodb引擎中解决不可重复读的问题引入了间隙锁,由于间隙锁的特性,所以幻读也相应的被解决了。

三、事务解决的两种方案:LBCC和MVCC

LBCC:Lock based concurrency control 基于锁的并发控制,这种方法的原理是通过 对数据加锁禁止其他事物在一个事务进行操作的事务同时进行操作,即不支持并发操作,而大多数时候我们对于数据库的操作都是读多写少,所以这种方案对效率的影响是非常大的。

MVCC:Multiple version concurrency control ,基于版本的并发控制,这种方案是通过在一份数据之前对它进行本分或者是快照,后面再去读取相关的快照便可以了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值