1-事务的概念
事务指的是逻辑上的一种操作,在这些操作中,要么全部成功,要么全部失败。就是即使它部分操作失败,系统也会保证事务的状态不会被部分更新。
2-手动提交事务
手动提交事务是指在数据库操作中,开发者需要显式地控制事务的提交与回滚。
这种操作允许在你执行完数据库的一系列操作以后,决定是否将这些操作永久的保存在数据库当中,或者在出现错误的时候可以撤销这些操作。
1-手动提交事务的基本步骤
1-开始事务
START TRANSACTION
使用START TRANSACTION或者BEGIN开启一个新的事务
2-执行SQL操作
在这里执行一些你需要进行的SQL操作
3-条件判断
根据操作的结果判断是需要提交回滚事务
4-提交或者回滚、
如果成功的话,使用COMMIT进行提交事务
如果失败的话,使用ROLLBACK撤销事务,回退到事务开始前的状态
5-示例
START TRANSACTION;
#开始事务
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- 假设这里有条件判断
IF (没有错误) THEN
COMMIT; -- 提交事务
ELSE
ROLLBACK; -- 回滚事务
END IF;
3-自动提交事务
MYSQL的每一条语句都是一个单独的事务,每条语句都会自动的开启事务,然后执行语句,然后自动提交事务。
在这里我们可以通过修改全局变量autocommit进行控制
然后设置自动提交的参数变为off
4-事务的四大特性
1-原子性
事务中的所有操作要么全部执行,要么完全不执行。如果事务在执行过程中发生错误时,事务需要回滚到事务开始之前的状态。
2-一致性
事务必须使数据库从一种一致状态到另一种一致状态。
3-隔离性
多个事务并发执行的时候,彼此之间不会互相干扰。
每个事务的执行结果对其他事务时不可见的, 直到该事务提交
4-持久性
一旦事务提交,其对数据库所作的修改是永久性的,哪怕数据库发生异常,重启之后数据依然存在。
5-事务的并发引发的几个问题
1-脏读
一个事务读取了另一个事务中未提交的数据,是最为严重的问题。
2-不可重复读
在一个事务当中多次读取同一项数据,但是获取到的结果不同。也就是值不同。
这通常是因为其他的事务对该项数据进行了个更新。
3-幻读
一个事务读取到了别的事务插入或者删除的数据,使得在读取数据的是时候,第一次和第二次查询的结果不一致,导致记录的行数不同。
6-事务的隔离级别
级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
---|---|---|---|---|---|---|
1 | 读未提交 | read uncommitted | 是 | 是 | 是 | |
2 | 读已提交 | read committed | 否 | 是 | 是 | Oracle和SQL Server |
3 | 可重复读 | repeatable read | 否 | 否 | 是 | MySQL |
4 | 串行化 | serializable | 否 | 否 | 否 |
2、安全和性能对比
安全性:serializable > repeatable read > read committed > read uncommitted
性能 : serializable < repeatable read < read committed < read uncommitted
3、注意:其实三个问题,开发中最严重的问题就是脏读,这个问题一定要避免,而关于不可重复读和虚读其实只是感官上的错误,并不是逻辑上的错误。就是数据的时效性,所以这种问题并不属于很严重的错误。如果对于数据的时效性要求不是很高的情况下,我们是可以接受不可重复读和虚读的情况发生的。