事务原则: ACID原则 原子性、一致性、隔离性、持久性 (脏读、幻读……)
参考博客链接: https://blog.csdn.net/dengjili/article/details/82468576
6.1、事务原则: ACID原则 原子性、一致性、隔离性、持久性
原子性(Atomicity)
要么都成功、要么都失败
![image.png](https://img-blog.csdnimg.cn/img_convert/688fb0b15dcaac7a7c9fb7963d135fdc.png#clientId=u04a7afad-df88-4&from=paste&height=348&id=u5c2f54ae&margin=[object Object]&name=image.png&originHeight=562&originWidth=521&originalType=binary&ratio=1&size=45150&status=done&style=none&taskId=u11d4ffa2-3a75-4e8c-9038-02966798c41&width=322.5)
一致性(Consistency)
事务前后数据的完整性必须保持一致。
![image.png](https://img-blog.csdnimg.cn/img_convert/7607a59e2777e87184d757c85374e242.png#clientId=u04a7afad-df88-4&from=paste&height=476&id=uc8a56caa&margin=[object Object]&name=image.png&originHeight=644&originWidth=586&originalType=binary&ratio=1&size=50557&status=done&style=none&taskId=uaa0ab8f5-0071-4e5b-97bb-89f3ed665f2&width=433)
持久性(Durability)
事务一旦提交就不可逆、被持久化到数据库中!
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
![image.png](https://img-blog.csdnimg.cn/img_convert/c38be6c27cbb20db69e45f54a1b87303.png#clientId=u04a7afad-df88-4&from=paste&height=556&id=u45295a8a&margin=[object Object]&name=image.png&originHeight=706&originWidth=622&originalType=binary&ratio=1&size=76560&status=done&style=none&taskId=u7d7efd01-ef41-4742-afd5-2f732222d88&width=490)
隔离导致的一些问题
脏读:
指一个事务读取了另外一个事务未提交的数据。
![image.png](https://img-blog.csdnimg.cn/img_convert/28c95ac225c4cbafdcc5267c5838c684.png#clientId=ubf15bf4c-9ad4-4&from=paste&height=233&id=ue2901e46&margin=[object Object]&name=image.png&originHeight=465&originWidth=998&originalType=binary&ratio=1&size=77092&status=done&style=none&taskId=u2f8f21be-5d99-4143-96ac-8203204f8a2&width=499)
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。
(一般是行影响,如下图所示:多了一行)
![](https://img-blog.csdnimg.cn/img_convert/76c2f14ae2e53161746ec14806c625f7.png#clientId=ubf15bf4c-9ad4-4&from=paste&id=Zhlgb&margin=[object Object]&originHeight=343&originWidth=245&originalType=url&ratio=1&status=done&style=none&taskId=ueba62297-f8aa-4f3d-8e9c-c09e7b8b1fc)
6.2、手动处理MySQL事务
-- 手动处理事务
set autocommit=0; -- ①关闭自动提交
start transaction;-- ②开启一组事务
-- ③执行代码
update result set studentresult=63 where studentno=1;
commit;-- ④提交事务(执行成功), 一旦提交就会持久化
rollback -- 或者回滚(执行失败)
set autocommit=1 -- ⑤恢复自动提交