数据库之mysql与oracle比较

本文详细对比了MySQL与Oracle数据库在事务处理、存储引擎、锁机制等方面的差异,探讨了行级锁的实现及悲观锁与乐观锁的概念。同时,针对@Transactional注解在实际应用中的注意事项进行了阐述,提醒开发者合理使用事务以提高系统性能。
摘要由CSDN通过智能技术生成

1. 比较

项目mysqloracle
对事务的提交自动提交需要手动提交,commit
事务隔离级别repeatable-read,可重复读read commit, 读已提交
对事务的支持在innodb存储引擎的行级锁的情况下才可支持事务完全支持事务
存储引擎Innodb(B+树),myISAM(B+树), memory无, B-树
应用场景小巧,免费,安装简单。集中于互联网方向收费,安全性高。 适用于服务器比较大的单节点或集群环境,对于可用性,安全性,健壮性,实时性要求极高的业务。大型企业,银行、金融
单表数据量单表行数超过 500 万行或者单表容量超过 2GB,推荐进行分库分表推荐是单表500万

备注:
事务隔离级别为读提交时,写数据只会锁住相应的行
事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。

2. 行级锁

mysql行级锁:
mysql中的行级锁是由以下sql语句产生:
select * from job_info where id = 1 for update;
主要加上了for update,其中id为主键。
如果查询条件不是主键,则会成为表锁。

3. 悲观锁与乐观锁

悲观锁和乐观锁
悲观锁虽然能保证数据一致,可是如果进程从读取到更新的时间太长,会导致其他进程等待时间较长,使得系统效率降低。如有重试机制,也可能会耗光数据库连接数。

乐观锁,是为数据库表增加一个标识数据版本的version字段来实现的,读取数据时把version字段一同读出,写入数据库时比对version字段就知道数据是否被更改过,如果version不相等就说明持有的是过期数据,不能写入,如果相等就可以写入,并把version加一。

4. @Transactional注意点

4.1 不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。

4.2 不要图省事,将@Transactional放置在类级的声明中,放在类声明,会使得所有方法都有事务。故@Transactional应该放在方法级别,不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。

4.3 使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)

4.4 使用了@Transactional的方法,只能是public,@Transactional注解的方法都是被外部其他类调用才有效,故只能是public。道理和上面的有关联。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也 不会报错,但事务无效。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值