文章标题
一: 使用场景
二: 定义
三: 举例说明
四: 总结
温馨提示: 本文总共4530字,阅读完大概需要5-7分钟,希望您能耐心看完,倘若你对该知识点已经比较熟悉,你可以直接通过目录跳转到你感兴趣的地方,希望阅读本文能够对您有所帮助,如果阅读过程中有什么好的建议、看法,欢迎在文章下方留言或者私信我,您的意见对我非常宝贵,再次感谢你阅读本文。
一: 使用场景
二: 定义
(一) 在平常的工作中有使用过事务?
1、定义: 事务既多个对数据库操作的集合,这些操作要么一起成功,要么一起失败。
2、使用场景: 当对存在多个对数据库的操作的时候,这些操作要么一起成功,要么一起失败时就可以使用到事务。如: 创建一个订单的时候,需要减去库存,那么这两个对数据库的操作必须同时成功或者失败,不然就会出现订单创建失败但是却减去了库存,或者创建订单成功却没有减去库存的问题。
(二) 事务有什么特性,具体的含义是什么?
答:事务的基本特性有: ACID,具体含义如下:
原子性(Atomicity): 表示事务是一个不可分割的工作单位,事务中的操作要么全部成功、要么全部失败。如: 创建订单、扣减库存是同时成功或者同时失败
一致性(Consistency): 表示事务操作前后的数据完整性要保持一致。如: A账户有30块,转了10块给B账户,事务前后总的金额还是30块,不会随着A转移到B账户就导致数据完整性不一样了
隔离性(Isolation): 并发情况下操作数据库时,多个事务之间是相互隔离的,操作是互相不影响的,可以通过设置隔离级别来控制,具体下面会举例说明。如: A事务修改了C记录的年龄,B事务同时读取C记录的年龄,这时候B事务读取到的年龄还是A事务修改之前的,因为A事务没有提交(这个案例是以:Mysql数据库进行举例,默认的隔离界别是可重复读)
持久性(Durability): 事务对数据库的数据影响是永久的,只要提交了事务,那么数据库的数据就被更改了,即使数据库出现故障,也不会对这个数据造成影响。如:A事务修改了张三的年龄为1000岁,并提交了,那么即使这个数据是不对的,但是张三的年龄也只能是一千岁了(笑…)
注意: 事务在提交之前是可撤回的如:张三开启事务后准备给李四转1万块钱,但是在提交之前他又回滚了,直接调用事务的撤回(rollback),那么李四账户里面是不会收到张三转过来的钱的。
(三) 事务的隔离级别会导致什么问题,能够举例说明?
一: 事务的隔离级别分为:
1、读未提交(Read Uncommitted): 会导致脏读、不可重读读、幻读问题。
2、读已提交(Read Committed): 会导致不可重读读、幻读问题(PostgreSQL数据库默认的隔离级别)。
3、可重复度(Repeatable Read): 会导致幻读问题(Mysql数据库默认的数据库隔离级别)。
4、串行化(Serialized):不存在任何问题,但是这个效率非常低,同一时刻只能有一个用户可以操作数据库,只有这个用户操作完了,其他的用户才能进行操作。
二 不同的事务隔离级别会导致的问题:
1、脏读: 一个事务读取到另一个事务未提交的数据。如: 张三说还李四一万块,开启事务之后就将钱转给李四,然后打电话叫李四看钱到没,李四查看说到了,然后张三直接回滚事务(rollback),既事务内所有的操作都放弃,张三自己账户的钱没扣,却说已经还给李四了,李四再查看,发现自己的账户没有转入的钱,只能当冤大头了(笑)
2、不可重读读: 在同一个事务下,多次读取同一个记录但返回的数据不一样(这个是针对:更新操作)。如: A,B两个事务同时访问数据库,B事务查询数据库发现A账户还有一万块钱,此时A事务购买了东西,账户被扣了五千元,B忘记了账户还有多少钱,再查看,发现卡上只有五千元了,这种情况就是不可重复读
3、幻读: 在同一个事务中,多次读取的数据数目前后不一致(这个主要是针对: 添加和删除操作)。如: A,B两个事务同时操作数据库中,A查询表发现还有10个记录,此时,B事务删除了两条,并提交了事务,A事务再查看发现少了两条记录,就感觉自己出现了幻觉一样,这个就是幻读。
三: 举例说明
(一): 注意事项(以Mysql数据库为例,开启两个控制台进行测试)
1、查询Mysql默认的数据库隔离级别:
(1)、mysql5.7以后: show variables like 'transaction_isolation';或者select @@transaction_isolation; (2)、mysql5.7以前: show variables like 'tx_isolation';或者select @@tx_isolation;
2、修改数据库隔离级别(修改后需要退出重新登录才生效):
set global tx_isolation='read-uncommitted(填写隔离级别)';
3、脏读现象测试:
(1): 设置隔离级别为Read-Uncommitted
(2): 测试数据
4、不可以重复读现象测试:
(1): 设置隔离级别为Read-Committed
(2): 测试数据
4、幻读现象测试:
(1): 设置隔离级别为Repeatable-Read
(2): 测试数据
5、延伸知识:
四: 总结
从上面实际的案例中我们发现,在并发情况下数据库会因为不同的隔离级别而出现不同的问题,所以我们要根据实际情况去设置数据库的隔离级别(但是一般是使用数据库默认的,除非有特殊要求),千里之行始于足下,希望大家看完文章可以手动实践一下,这样可能印象会更加深刻。
非常感谢你的阅读! 码字不易,如果你觉的文章对你有帮助的话,请给我点个赞和关注,后面还会书写更多的文章跟大家分享其他的知识。