Mysql的事务和事务的隔离级别,读写引发的安全问题以及解决方案

1.事务的特性: ACID 原子性,一致性,隔离性,持久性

·隔离性-->一个事务执行的过程中,不应该受到其他的事务的干扰

2.如果不考虑隔离性,就会引发一些 读 的问题

·脏读 --> 一个事务读到另一个事务未提交的数据

·不可重复读 --> 一个事务读到了另一个事务已经提交的update数据,导致多次查询结果不一致

·虚读(幻读) --> 一个事务读到了另一个事务已经提交的insert数据,导致多次查询的结果不一样

3.通过设置数据库的隔离级别来解决上述读的问题

-未提交的读(Read uncommitted):  以上读的问题都有可能发生

·已提交的读(Read committed): 避免了脏读,但是不可重复都,幻读有可能发生

·可重复读(Repeatable): 避免了脏读,不可重复读,但是幻读避免不了

·串行化(Serializable): 以上读的情况都可以避免

4.如果不考虑隔离性,也会产生写入的问题,这一类的问题叫丢失更新问题

·例如: 两个事务同时获取到一条记录做修改,一个事务拿到一条记录的信息进行修改,在未提交的情况下,

另一个事务又拿到了这天记录的信息,这时候第一个拿到信息的事务提交了数据。之后后来的那个事务

提交的数据就会覆盖的第一个事务提交的数据,这样就叫 丢失更新

4.1解决丢失更新有两种方案

·悲观锁: 采用的是数据库提供的一种锁机制,在SQL语句的后面添加for update 字句

·当A事务在操作该记录时,会把这条记录锁起来,其他事务是不能操作这条记录的

·只有当A事务提交后,锁释放了,其他事务才能操这条记录

·乐观锁: 采用版本号的机制来解决的。会给表结构添加一个字段version=0,默认值是0

·当事务A在操作完该记录时,会先保存一个版本号,提交事务时,会先检查版本号,如果发现版本号的值相同时

才可以提交事务,同时会更新版本号version

·当事务B操作完该条记录时,提交事务时,会先检查版本号,如果发现版本不同的时候,就会程序出错

这时候,就可以返回个客户端提示 用户,更新失败,请从新提交




猜你喜欢

转载自blog.csdn.net/weixin_38104426/article/details/79493143
今日推荐