一个事务的开始和结尾必须是 start transaction | commit; rollback
事务特性
1.原子性:多个操作打包成一个整体,要么全部执行,要么一个都不执行。
不过这里的“一个都不执行”并不是真正的全不执行,只是看起来与没执行一样。如果是中间戳错了,就自动把前面已经成功执行的操作,进行还原(rollback,回滚就是通过日志记录数据库事务操作的中间过程,按照原操作的逆操作进行)。
2.一致性:事务执行前后数据可以对上(依靠约束)
3.持久性:事务里执行的操作都是持久生效的,最终会被写在硬盘里,一旦事务执行成功,所有操作产生的修改都会被写在硬盘里。
并且持久性是通过日志实现的,事务日志包括回滚日志,重做日志
4.隔离性:并发执行事务的时候,隔离性,会在执行效率和数据可靠之间做出权衡~~
"隔离"描述的是同时执行的事务之间,相互的影响~~
隔离性越高,并发性就越低;数据越可靠,性能就越低(银行转账)。反之就是点赞数。
临时的并非准确的 我们称之为“脏读”。解决脏读问题就得给 写 操作加锁🔒。脏读读取未提交的数据,在进行写操作时,可以使用锁来保证数据的一致性,避免其他事务对数据进行读取。(提交前不能读)
不可重复读问题指的是同一个事务中多次查询同一数据行时,由于其他事务修改了该行数据,导致该事务中多次查询到的结果不一致,出现了“不可重复读”的现象。解决办法就是给读操作加锁。(读的时候不能去修改)
幻读是指在一个事务内,多次执行相同的查询语句,但由于其他事务插入、更新或删除了符合查询条件的数据行,导致每次查询返回的结果集不一致的情况。与不可重复读类似,幻读也可能破坏了事务的隔离性和数据的一致性。
幻读可以看成是不可重复读更进一步,比如一个事务在多次读的时候,虽然读到的数据是一样的,但是结果集是不一样的,第一次读假设是10条记录,第二次读是11条记录,11条中的10条与之前是一样的,但多出来一个。
解决办法就是串行化,彻底放弃并发执行事务,一个接一个执行。(串行化并发性最低,隔离性最高,效率最低,隔离性最高)
小结:
在并发执行事务的过程中,可能产生以下问题:
1.脏读
读到了写事务提交之前的中间数据(脏数据)写加锁.提交之前,不能读~
2.不可重复读
一个事务之内,多次读取同一个数据,发现数据不一样(在读的过程中,另一个事务修改了数据)读加锁.读的时候,不能修改了~3.幻读
一个事务之内,多次读到的数据,值相同,但是结果集不同.彻底串行化,完全放弃并发执行
四种隔离级别:默认是repeatable read (RC)进行了写和读加🔒
越往下,隔离级别越高,并发性越低;
数据可靠越高,性能越低;
read uncommitted
不做任何处理,事务间随意并发read committed
对写操作加锁,解决了读脏数据问题repeatable read
对读写操作加锁,解决了读脏数据问题,不可重复读问题serializable
严格串行化,解决了三个由并发引起的问题,并发程度最低,隔离性是最高的
- 读未提交(read uncommitted),指一个事务还没提交时,它做的变更就能被其他事务看到;
- 读提交(read committed),指一个事务提交之后,它做的变更才能被其他事务看到;
- 可重复读(repeatable read),指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQL InnoDB 引擎的默认隔离级别;
- 串行化(serializable );会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;

线性探测是一种哈希表解决冲突的方法。当发生哈希冲突时,线性探测会在哈希表中顺序地查找下一个可用的位置,直到找到一个没有被占用的位置或查遍整个哈希表。
具体来说,线性探测的插入过程如下:
- 将要插入的元素进行哈希计算,得到对应的哈希值。
- 如果该位置没有被占用,将元素插入该位置,并结束插入操作。
- 如果该位置已经被占用,线性探测会在哈希表中顺序查找下一个位置,直到找到一个空闲位置,然后插入元素,并结束操作
2. 如何使用事务 使用事务有两种方式,分别为 显式事务 和 隐式事务 。 2.1 显式事务 步骤1: START TRANSACTION 或者 BEGIN ,作用是显式开启一个事务。 START TRANSACTION 语句相较于 BEGIN 特别之处在于,后边能跟随几个 修饰符 : UPDATE accounts SET money = money - 50 WHERE NAME = 'AA'; UPDATE accounts SET money = money + 50 WHERE NAME = 'BB'; mysql> BEGIN; #或者 mysql> START TRANSACTION; ① READ ONLY :标识当前事务是一个 只读事务 ,也就是属于该事务的数据库操作只能读取数据,而不 能修改数据。 ② READ WRITE :标识当前事务是一个 读写事务 ,也就是属于该事务的数据库操作既可以读取数据, 也可以修改数据。 ③ WITH CONSISTENT SNAPSHOT :启动一致性读。 步骤2:一系列事务中的操作(主要是DML,不含DDL) 步骤3:提交事务 或 中止事务(即回滚事务) 2.2 隐式事务 MySQL中有一个系统变量 autocommit : 当然,如果我们想关闭这种 自动提交 的功能,可以使用下边两种方法之一: 显式的的使用 START TRANSACTION 或者 BEGIN 语句开启一个事务。这样在本次事务提交或者回 滚前会暂时关闭掉自动提交的功能。 把系统变量 autocommit 的值设置为 OFF ,就像这样: 2.3 隐式提交数据的情况 数据定义语言(Data definition language,缩写为:DDL) 隐式使用或修改mysql数据库中的表 事务控制或关于锁定的语句 ① 当我们在一个事务还没提交或者回滚时就又使用 START TRANSACTION 或者 BEGIN 语句开启了 另一个事务时,会 隐式的提交 上一个事务。即: ② 当前的 autocommit 系统变量的值为 OFF ,我们手动把它调为 ON 时,也会 隐式的提交 前边语 句所属的事务。 # 提交事务。当提交事务后,对数据库的修改是永久性的。 mysql> COMMIT; # 回滚事务。即撤销正在进行的所有没有提交的修改 mysql> ROLLBACK; # 将事务回滚到某个保存点。 mysql> ROLLBACK TO [SAVEPOINT] mysql> SHOW VARIABLES LIKE 'au