qidao123.com技术社区-IT企服评测·应用市场

标题: mysql InnoDB的事务 [打印本页]

作者: 小秦哥    时间: 2025-3-31 00:19
标题: mysql InnoDB的事务
一、事务的概念

一组数据库操作要么全部成功,要么全部失败,目的是为了保证数据的最终一致性
二、事务的四大特性(ACID)

三、事务的隔离级别

InnoDB引擎中提供了四种隔离级别,级别越高事务的隔离行越好,但性能就越低,而隔离性是由mysql的各种锁以及MVCC机制来实现
三、脏读、不可重复读、幻读都是什么?


  1. set tx_isolation = 'read-uncommitted';
  2. begin;
  3. update test_tab set blance = blance + 500 where id =1;
  4. commit ;
复制代码
  1. set tx_isolation = 'read-uncommitted';
  2. begin ;
  3. select * from test_tab where id = 1;
  4. commit ;
复制代码

在事务修改sql事务未提交的环境下,查询结果是更新后的数据。在修改未提交事务时,被另一个事务读去到结果,可见是错误。脏读也就是写的事务未提交时,被另一个事务读区到结果。
  1. set tx_isolation = 'read-committed';
  2. begin;
  3. update test_tab set blance = blance + 500 where id =1;
  4. commit ;
复制代码
  1. set tx_isolation = 'read-committed';
  2. begin ;
  3. select * from test_tab where id = 1;
  4. commit ;
复制代码
实验步骤:
1、开启一个事务,在事务中更新数据,不提交事务。再开启一个事务,查询正在更新的那条数据,不提交事务。

2、步骤1更新数据的事务提交,再次查询那条数据,不提交事务。

3、步骤1更新语句再次实验,不提交事务。再次查询那条数据,不提交事务。

4、步骤3的更新事务提交。再次查询那条数据,不提交事务。

5、查询的事务提交。

查询的事务无论是否提交,读到的数据都是已经提交事务的数据。
  1. set tx_isolation = 'repeatable-read';
  2. begin;
  3. update test_tab set blance = blance + 500 where id =1;
  4. commit ;
复制代码
  1. set tx_isolation = 'repeatable-read';
  2. begin ;
  3. select * from test_tab where id = 1;
  4. select * from test_tab where id = 1;
  5. commit ;
  6. select * from test_tab where id = 1;
复制代码
步骤:
1、1、开启一个事务,在事务中更新数据,不提交事务。再开启一个事务,查询正在更新的那条数据,不提交事务。

2、2、步骤1更新数据的事务提交,再次查询那条数据,不提交事务。

3、步骤1更新语句再次实验,不提交事务。再次查询那条数据,不提交事务。

4、步骤3的更新事务提交。再次查询那条数据,不提交事务。

5、查询的事务提交,再次查询。

在一个事务里,只要读过了这条数据,后边再读这条数据都以第一次读到的这条数据为主。
那么如何办理这个问题呢?
第一个办法就是用更更高的隔离级别。
第二个办法用乐观锁机制,加上一个version字段,查询的时候将version字段查出来select 业务字段,version from table,更新的时候每次version字段+1 update table set 业务字段, version = version + 1 where version = 前边查出来的version值,知道影响行数大于0。
第三个办法可以使用数据库的悲观锁,假如字段计划到计算的时候,用业务字段 = 业务字段 + 数量,由于mysql的insert、update会有写锁,每次都会用数据库中的最新的数据进行操作

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4