对电子商务平台数据库锁与事务高并发性的思考(2)
摘要:大多数电子商务企业使用事务数据库。本文以MySQL为分析对象,以InnoDB为数据库引擎。结合通用spring框架,我们分析了数据库锁和事务在特定场景中的工作方式。本文从以下几个方面讨论数据库锁和事务。
大多数电子商务企业使用事务数据库。本文以MySQL为分析对象,以InnoDB为数据库引擎。结合通用spring框架,我们分析了数据库锁和事务在特定场景中的工作方式。本文从以下几个方面讨论数据库锁和事务。
首先,它简要介绍了什么是锁。目前,在多进程、多线程执行中存在并发问题。简单地说,多个操作是按随机顺序处理的。如果没有锁定,就会出现数据覆盖率和数据计算错误等问题。因此,为了使操作有序,需要对它们进行锁定,如Java中的锁定和同步。在数据库实现中,锁用于防止并发,但对于数据库用户,我们关心的是数据库将被锁定的条件和添加的锁。
与其他数据库相比,MySQL的锁机制相对简单,其***的特点是不同的存储引擎支持不同的锁机制。例如MyISAM和内存存储引擎使用表级锁;InnoDB存储引擎支持行级锁和表级锁,但默认采用行级锁。表级锁具有成本低、加锁快、无死锁、锁粒度大、锁冲突概率***、并发性***等优点。行级锁开销大,添加速度慢,会出现死锁,锁粒度小,锁冲突概率***,并发性***。
(1) 在执行查询语句(select)之前,MyISAM将自动向所有涉及的表添加读锁。在执行更新操作(update、delete、insert等)之前,MyISAM将自动向所涉及的表添加写锁。此过程不需要用户干预
(2) InnoDB实现了以下两种类型的行锁。
共享锁:也称为读锁。允许事务读取行,并防止其他事务获取同一数据集的独占锁。如果事务t向数据对象a添加s锁,则事务t可以读取a,但不能修改a。在t释放a上的s锁之前,其他事务只能向a添加s锁,而不能向x锁添加s锁。这确保了其他事务可以读取a,但在t释放a上的s锁之前,不能对a进行任何更改。
独占锁(x):也称为写锁。允许获取独占锁的事务更新数据,防止其他事务获取同一数据集共享读锁和独占写锁。如果事务t向数据对象a添加x锁,则事务t可以读取a或修改a。在t释放a上的锁之前,其他事务不能向a添加任何锁。
对于共享锁,您很可能理解多个事务只能读取数据,不能更改数据。
对独占锁的理解可能存在一些差异。我一开始就犯了个错误,以为排他锁锁定了一行数据后,其他事务就不能读取和修改该行数据,事实并非如此。互斥锁是指在事务的一行数据中添加互斥锁后,其他锁不能添加到其他事务中。mysqlinnodb engine的默认数据修改语句update、delete和insert会自动为所涉及的数据添加排他锁。默认情况下,select语句不会添加任何锁类型。如果添加了独占锁,则select可以用于UPDATE语句,也可以使用select Lockingsharemode语句。因此,具有独占锁的数据行不能在其他事务类型中修改,也不能通过forupdate和lockingsharemode锁查询,但可以通过select From直接查询。。。查询数据,因为普通查询没有锁定机制。
另外,InnoDB引擎也有意向锁。请参考MySQL数据库中意向锁的含义
并发情况下数据库中的数据异常主要分为以下几类:
a、 脏读:事务a读取事务B的更新数据,然后B回滚操作,因此a读取的数据是脏数据
b、 不可重复读取:事务a多次读取同一数据,事务b在多次读取事务a的过程中更新并提交数据,导致事务a多次读取同一数据时结果不一致。
c、 非真实阅读:系统管理员a将数据库中所有学生的分数从特定分数改为ABCDE成绩,但系统管理员B此时插入特定分数的记录。当系统管理员a完成更改并发现仍有一个记录未更改时,这就像一个幻觉,称为非真实读取。
在提到数据库异常之后,我们提出了四个数据库隔离级别来解决这些数据库异常:read uncommitted、read uncommitted、repeatable read和serializable
每个隔离级别通过锁定保证数据库数据的一致性。此外,为了提交数据库并发性,InnoDB结合了mvcc(多版本快照,加上版本号差异)和锁组合模式。它使用多版本,无锁读取,锁防止数据异常
什么是数据库事务?简单地说,事务指的是一组逻辑操作。这组操作的每个单元要么全部成功,要么全部不成功。
例如,a向B转账100元,对应以下两条SQL语句:
updatefromaccountsetmoney=money+100wherename='b';
updatefromaccountsetmoney=money-100wherename='a';
数据库的默认事务是自动提交的,即发送一个SQL时执行一个SQL。如果要在一个事务中执行多个SQL,则需要使用以下语句:
数据库打开事务命令:
Starttransaction:启动事务
回滚:回滚事务
提交:提交事务
让我们讨论一下数据库锁和事务关系。数据库在事务开始时(如更新操作)应用数据库锁,但在事务未提交时获取的锁不会释放。如果更新是锁定的表或行,则表上的其他操作或行更改数据操作需要等待解除锁定。如果其他事务不提交数据,则其他操作需要等待锁等待超时,因此数据库事务操作的范围不能太大,导致阻塞其他事务数据。
电子商务平台必然会设计事务数据库的操作,而数据库的操作也可能导致重复操作和并发问题。在使用过程中,必须使用事务添加多个表操作。此外,事务添加的范围不能太大和小化。此外,事务传播机制用于限制事务是否回滚和范围。此外,并发操作是必需的,我们可以考虑CAS乐观锁或条件限制的并发操作