什么是事务
一件事就可以事务,事务就是操作过程合集统称
事务的特性
原子性:一段事务中,要么全部完成,要么都不完成
隔离性:两个客户同时操作同样的事务的解决方案,应用及其广泛,所以针对以上情况出现了事务的隔离级别:读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
一致性:在事务开始之前或者结束之后,数据库内的数据是完整的符合预设规则
持久性:一旦提交数据库,数据就会永久保存到数据(除非你进行了非法操作)
事务步骤
- 开启事务
start transaction;
SQLServer使用:begin transaction;
- 提交事务
commit;
- 回滚事务
rollback;
开启事务后直接写增删改业务即可
事务的隔离级别
- 脏读
所有事务都可以看到其他未提交事务的执行结果,该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据 例:用户A向用户B转账100元,但是不将该操作提交,读未提交的情况下,B查看账户时发现钱确实已到账,但用户A转账这个操作只要不提交,事务就会被回滚,之后B再查看账户时会发现钱没到账,这也就是出现了脏读。 - 幻读
幻读的重点在于新增或者删除,同样的条件, 第1次和第2次读出来的记录数不一样 - 重复读
系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样 - 串行化
事务 A 和事务 B,事务 A 在操作数据库时,事务 B 只能排队等待。这种级别可以避免“幻读”,每一次读取的都是数据库中真实存在数据,事务 A 与事务 B 串行,而不并发。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | ✔ | ✔ | ✔ |
读已提交 | ❌ | ✔ | ✔ |
可重复读 | ❌ | ❌ | ✔ |
串行化 | ❌ | ❌ | ❌ |
锁
- 乐观锁
有a、b俩事务,当a事务在查询数据的时候,对b没影响,而且当a事务在更改数据提交的时候虽然会验证数据完整性,但这时b事务中数据发生改变也不会影响到a事务中对该数据的更改。 - 悲观锁
看字面意思悲观,则他就很悲观,即当某一事务操作数据的时候,他就会提前上锁。只有当它操作完该数据的时候释放锁,别的事务才可以进行操作该数据。