这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记。
1、数据库事务处理
- 定义:数据库中一个单独的执行单元,通常由SQL语言或编程语言编写的用户程序的执行所引起。当在数据库中更改数据成功时,在事务中更改的数据会提交,不可改变。否则,事务就取消或者回滚,更改无效。
- 事务必须满足四个属性(ACID):
- 原子性(Atomicity):事务是一个不可分割的整体,当数据修改时,要么全部执行,要么全部不执行,不允许事务部分地完成。
- 一致性(Consistency):一个事务在执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态应该满足模式锁指定的约束。
- 由于并发操作带来的数据不一致性包括:
- 脏读:一个事务读取了另一个事务未提交更新的数据。
- 不可重复读:在一个事务内两次读到的数据是不一样的。
- 幻读:当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一次查询不相同。
- 由于并发操作带来的数据不一致性包括:
- 隔离性(Isolation):当两个或多个事务并发执行时,为了保证数据的安全性,将一个事务内部的操作隔离起来,不被其他的正在进行的事务看到。如对于任何一对事务T1和T2,对T1而言,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。
2、数据库有四种类型的事务隔离级别:
- 读未提交: 第一个事务未提交更新的数据,第二个事务可以读到 可能出现脏读、不可重复读、幻读
- 读已提交(不可重复读): 第一个事务未提交更新的数据,第二个事务读不到;第一个事务提交更新的数据,第二个事务可以读到 同一事务内读取的数据结果不一致 解决脏读,会出现不可重复读和幻读 可重复读(MySQL默认的事务隔离级别): 同一事务内读取的数据结果一致 解决脏读,不可重复读,但会出现幻读
- 串行化 (Serializable): 所有事务操作按顺序执行,性能最差 解决脏读、不可重复读、幻读
- 持久性(Durability): 事务完成后,数据库管理系统保证它对数据库中数据的修改是永久性的,当系统或介质发生故障时,该修改也永久保持。 一般通过数据库备份与恢复来保证。
3、存储过程及其优点
- 存储过程(Stored Procedure)定义:一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后,再次调用不需要再次编译,用户通过指定存储过程的名字并给出必要的参数来执行。
- 存储过程语法:
- 创建存储过程:create procedure sp_name @[参数名][类型] as begin SQL语句 end
- 调用存储过程:exec sp_name[参数名]
- 删除存储过程:drop sp_name[参数名]
- 优点:
- 执行效率高。无须多次编译。
- 减少网路流量。在调用时不需要每次把SQL语句传输到数据库上。
- 安全机制好。通过对存储过程进行授权,从而保证安全性。