目录
什么是事务
在数据库中,事务的本质就是把多条SQL语句打包成一个整体,要么全都执行,要么全都不执行
通过实际业务理解事务:
在实际生活中我们的转账操作涉及到两步,比如小王给小李转账五百
1.小王的账户金额 减500
2.小李的账户金额 加500
这两步操作中,如果小王转账后,恰好数据库崩溃了,导致小李没有到账,这种情况就很麻烦
因此我们要将这两条SQL语句打包为一个整体,要么都执行 小王-500 小李+500,要么两者都不执行 这样双方都不会有损失
这样的打包操作就称为 事务
将俩操作打包为一个事务后,如果第一个SQL执行完系统崩溃了,下次数据库启动后会自动把上次修改一般的数据还原.(给小王加回500) 数据库通过 回滚 (rollback)操作进行还原
数据库会有个专门记录事务操作步骤的日志,会额外占用硬盘空间,因此使用事务的时候,执行SQL语句的开销是更大,效率是更低的
事务的使用
start transaction;-- 阿里巴巴账户减少 2000update accout set money=money- 2000 where name = ' 阿里巴巴 ' ;-- 四十大盗账户增加 2000update accout set money=money+ 2000 where name = ' 四十大盗 ' ;commit;
事务的特性
1.原子性
原子性是事务的核心特性
将多个SQL操作打包成一个整体,要么都一起执行,要么都不执行,没有中间状态
2.一致性
事务执行前后的数据应该是一致的,即使发生异常,也不会因为异常而破坏数据的完整性约束
比如小王有一千块,给小李转账五百,那么执行后应该是小王五百,小李五百.
不能是小李五百,小王还是有一千块
3.持久性
事务执行的各种操作都是持久生效的,事务执行完毕后会将修改后的数据重新写入到硬盘中
即使程序重启/主机重启/掉电, 事务都可以正常工作, 保证修改是生效的.
4.隔离性(重点)
隔离性是指数据库同时执行多个事务的时候,不同事务之间的相互影响程度
一个服务器, 可以同时给多个客户端提供服务, 这多个客户端是并发执行的关系, 多个客户端就会有多个事务, 多个事务同时去操作一个表的时候, 特别容易出现互相影响的问题.
并发执行事务的时候,隔离性会在 数据可靠 与 执行效率 之间做出权衡
隔离性越高,并发性越低,数据越可靠,数据库性能越低
隔离性越低,并发性越高,数据越不可靠,数据库性能越高
事务的异常
脏读
事务1在进行写操作 输入数据的时候,事务2去读取了表中的数据,但有可能此时的数据只是临时存在的 或者 想要的数据还没写入 ,并不是最终的结果. 这样的数据就称为 脏数据. 这样的读操作就是 '脏读' 问题
解决方法:
给写操作加锁,事务1在写操作时,事务2不能进行读操作,事务1写完数据后事务2再去读取的数据,就是事务1的最终数据了
给写操作加锁,事务的并发性降低了 (处理效率降低了),事务的隔离性提高了 (数据的准确性提高了)
不可重复读
事务1已结提交了数据,此时事务2开始去读取数据,而在读取过程中,事务3又再次提交了新的数据,导致同一个事务2里,多次读取的数据是不一样的 (预期在同一个事务中,读取的结果应该是一致的),这就是 '不可重复读' 问题
解决方法:
给读操作加锁,在进行读操作时,别的事务就不能再进行写操作了
给读操作加锁,事务的并发处理能力降低了 (处理效率降低了),事务的隔离性提高了 (数据的准确性提高了)