mysql并发与事务隔离级别

mysql事务自动提交
1、在mysql中,所有操作都是事务。
2、autoCommit设为true。事物会自动提交,任何curd语句,不需要任何额外操作,也不需要commit。mysql会把每一条数据当做一个事务,自动提交
3、autoCommit默认为true。START TRANSACTION 语句会把autoCommit置为false。一系列语句最后commit或者回滚之后。会自动把autoCommit复位。

多线程同时操作mysql肯定会涉及到安全问题。使用读写锁来保证线程安全。
事务只是把一组sql命令打包成一个,原子性操作。事务执行过程中一直在操作mysql,最后进行提交,如果没有提交则会进行回滚,恢复到执行之前的数据。但是还会有事务并发问题。也就是说会有很多事务同时在进行。如果不加锁来进行互斥,事务的并发会带来以下问题。

  • 脏读问题
    一个事务A执行完之后,还没有提交,另一个事务B或线程读到了新数据。然后事务没有提交,数据库回滚。事务B读到的就是脏数据,无效的数据。
  • 不可重复读问题
    事务A先查询了,然后其他事务进行了修改,事务A再次查询发现数据变了。不可重复读是指在一个事务中两次查询数据不一致。可以锁行解决。事务在进行查询修改行数据时,先对这一行加锁,其他线程无法访问这一行。
  • 幻读
    事务A先查询有10条数据,其他事务插入删除了一条。事务A在查询,发现数据变多变少了。这种情况可以锁表来解决。线程在访问一张表时,把这张表锁住,其他线程无法访问这张表。

mysql锁行和锁表都会造成mysql的性能下降。
mysql提供了四种事务隔离级别。

  • READ-UNCOMMITTED(读取未提交内容)级别:
    安全级别最低,没有任何的加锁保证线程安全的操作,线程并发问题 一个都没解决。
  • READ-COMMITTED(读取提交内容)级别 :
    只能看到已经提交了的内容,如果一个线程操作某一行数据,会把这行数据锁住。还没有提交。其他线程无法读取这行数据,只能阻塞等这行的锁被释放才能读取。解决了脏读的问题。
    使用行锁会降低性能,因此MVCC工具进行了优化。如果一个线程访问一行数据,对其加行锁,MVCC会生成一个镜像,事务提交之后再删除镜像,其他线程可以读取到旧数据。但是会产生不可重复读的问题。比如事务A修改之后还没提交,事务B读取到旧数据,事务A提交后,事务B再次读取发现数据不一致。

- REPEATABLE-READ(可重读)级别:(默认隔离级别)
事务B正在修改数据,还没提交。事务A读到了快照(旧数据),等事务B提交之后,事务A再进行查询,也只会查询到快照的内容,不会读取到更新之后的数据。但是没有解决幻读的问题。
在一个事务中,查询或修改某一行数据,都会对这一行数据有一个新增版本号。如果事务A先查询,版本号为1,事务B对其进行了修改版本号会变成2,事务A再次查询发现版本号变大了,说明有其他事务对这行数据进行了修改,那么就会去读快照,而不是直接读取这一行。

  • 串行化级别
    使用表锁可以解决所有问题,但是会极大降低性能,不推荐。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 中的并发控制和事务隔离级别是很重要的概念。在多个用户同时访问同一个数据库的情况下,如果不进行并发控制,就会出现数据不一致的问题。而事务隔离级别是指在多个事务同时执行的情况下,如何保证每个事务之间的数据隔离性。MySQL 支持多种隔离级别,包括: 1. 读未提交(Read Uncommitted):最低的隔离级别,允许一个事务读取另一个事务尚未提交的数据。这种隔离级别会导致脏读、不可重复读和幻读的问题。 2. 读已提交(Read Committed):允许一个事务只能读取另一个事务已经提交的数据。这种隔离级别可以解决脏读的问题,但是可能会出现不可重复读和幻读的问题。 3. 可重复读(Repeatable Read):允许一个事务读取另一个事务已经提交的数据,并且在事务结束之前,其他事务不能修改这些数据。这种隔离级别可以解决脏读和不可重复读的问题,但是可能会出现幻读的问题。 4. 串行化(Serializable):最高的隔离级别,确保每个事务都独立运行,没有并发问题。但是串行化会导致性能下降,因为它会锁定所有读取的数据。 在 MySQL 中,默认的隔离级别是可重复读。可以使用 SET TRANSACTION ISOLATION LEVEL 命令来设置隔离级别。同时,可以使用行级锁和表级锁来实现并发控制。行级锁可以锁定单独的行,而表级锁可以锁定整个表。在实际应用中,需要根据实际情况选择合适的隔离级别和锁的类型来保证数据的一致性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值