事务●必知必会【事务介绍、并发问题、隔离级别、悲观锁/乐观锁、事

2022-03-05  本文已影响0人  一乐乐

一、什么是数据库事务

1、事务Transaction(简写tx):

在数据库中,事务是指一组逻辑操作,无论成或败,都作为一个整体进行工作,要么全部执行,要么全部不执行。

2、事务的ACID特性:

原子性:事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做。

一致性:事务必须使数据库从一个一致性状态变成另外一个一致性状态。事务开始和完成,数据必须保持一致。(数据不被破坏)'数据守恒'】

隔离性:当多个事务处于并发访问同一个数据库资源时,事务之间相互影响程度,不同的隔离级别决定了各个事务对数据资源访问的不同行为。

持久性:事务一旦提交后,数据是永久性的、不可回滚。(数据的修改是永久的)。



二、数据库并发问题

1、数据库的事务并发问题:多个事务并发访问/修改同一个资源

★ 跟java中的线程问题---并发问题差不多,都是针对同一资源,同时访问/修改出现的问题。


2、事务并发可能导致的问题【丢失更新、脏读、幻读、不可重复读】

★ 例子:两个客户端同时对同一个银行账号进行操作,一个客户端进行存取,一个客户端进行取钱】

(1)第一类丢失更新

(2)第二类丢失更新

(3)脏读

(4)幻读

(5)不可重复读

❀ 每一个事务是有自己的空间的概念



三、事务的隔离级别

1、 mysql中的4种隔离级别(重点看是否脏读、不可重复读、幻读即可):

图片.png


2、Oracle 和 Mysql对隔离级别的支持

■ Oracle 支持 READ COMMITED(缺省)和 SERIALIZABLE。

■ MySQL 支持 四种隔离级别,缺省为 REPEATABLE READ


3、Oracle 和 Mysql 常用的隔离级别:

隔离级别 脏读 不可重复读 幻读
oracle---读已提交(只是避免了脏读)
mysql---可重复读取(避免了脏读和不可重复读)


4、如何选用:

隔离级别越高,数据库事务并发执行性能越差,能处理的操作越少。

因此在实际项目开发中为了考虑并发性能一般使用 READ COMMITED,它能避免丢失更新和脏读,尽管不能避免不可重复读和幻读,

不过更多的情况下使用悲观锁或乐观锁来解决。



四、解决事务并发的方法(悲观锁/乐观锁)

✿ 隔离级别在一定程度解决了事务并发问题,不过一般解决事务并发,咱会采取悲观锁/乐观锁。

1、悲观锁:事务A在操作时,悲观地认为其他事务会进来干扰自己。---[用的比较多,非常安全]。

(1)悲观锁:使用数据库自身的排它锁机制 [★原理数据库自身的锁机制(写锁)]

■ 使用客户端工具Navicat模拟(开启两个命令行窗口,可以拖动出来方便查看)并发:

图片.png 图片.png 图片.png 图片.png

■ 查询事务加上了 for update,其中一个事务处于阻塞状态,等着另一个事务的提交或回滚。

图片.png


2、乐观锁:事务A在操作时,乐观地认为其他事务不会进来干扰自己。

(1) ★原理:在表中额外添加一个列,用来表示修改的版本(整型类型),修改一次就把版本增加1.

图片.png 图片.png

(2)乐观锁的操作步骤:

图片.png



五、事务类型

■ 按服务器数量分,本地事务和分布式事务:

■ 在java中有,JDBC 事务和 JTA 事务:

■ 在项目中实现事务,声明式事务和编程式事务:


写在后面的话

       如果你觉得一乐的文章给您带来了一些收获,可以给个三连❤️ ,一乐会一如既往地更新有价值的博客。如果文章存在错误,也欢迎大家指出。还有,如果大家有什么好的学习技巧、学习感悟,也非常欢迎大家在评论区一起交流~

最后感谢大家的支持,谢谢~

上一篇下一篇

猜你喜欢

热点阅读