数据库事务:操作数据库的一个程序单元,包含查看或者更新的一组操作。
数据库事务的特性:
1)原子性:事务的一组操作不可分割,要么同时成功,要么同时失败。
2)一致性:事务的操作结果使数据库从一个一致性状态变到另一个一致性状态。
3)隔离性:并发执行的事务不会相互影响。
4)持久性:事务对数据库的影响是持久的。
并发事务的异常:
1)丢失更新:事务覆盖了其他事务已经提交的修改,好像其他事务丢失了一样。
2)脏读:事务读到了其他事务未提交的更改。
3)不可重复读:一次事务两次读取一条数据的结果不一样,原因是并发事务在过程中执行完了一个修改过程。
4)幻读:一次事务两次读取的统计类结果不一样,原因是并发事务更改了需要被纳入统计的数据。
隔离级别:
读未提交(READ-UNCOMMITTED):所有的并发事务异常都会遇到
读已提交(READ-COMMITED):oracle数据库默认隔离级别,会遇到不可重复度或者幻读
不可重复读(REPEATABLE-READ):mysql数据库默认隔离级别,会遇到幻读
串行化(SERIALIZABLE):禁止了并发操作,不会遇到任何并发事务异常
关于丢失更新:特点是2个同时开启的事务,操作同样的查询结果,后提交或者后撤销的事务覆盖了之前提交的事务的结果。
丢失更新和其他3种并发事务异常比较:丢失更新是由周期较长的事务更新操作产生的;其他3种异常是由周期较短的事务提交产生的。
丢失更新分2种:
1)回滚更新丢失
2)覆盖丢失
第一种丢失是直接被数据库禁止的,我们通常只会遇到第二种丢失更新。
解决办法就是使用“锁机制”。锁机制分2种:悲观锁和乐观锁。
悲观锁:假设丢失更新会高概率发生则使用悲观锁,避免频繁更新出错。
悲观锁具体分2种:
共享锁:select * from account lock in share mode;
排它锁:select * from account for update;
乐观锁:假设丢失更新出现的概率低,可考虑使用乐观锁,以免锁的时间太长影响其他人操作。
实现方法:
1)在表中加入一个类型为timestamp的字段,并且设置成只要表插入或者更新操作就自动变为最新时间。
2)更新操作时先通timestamp字段检查当前查询结果是不是最新的版本。
常用的2种锁为排它锁和乐观锁。
mysql操作隔离级别相关命令:
查看数据库版本:select version();
查看数据库隔离级别:
select @@tx_isolation; // mysql 5.x
select @@session.transaction_isolation; // mysql 8.x
设置数据库隔离级别:
参数分别为READ-UNCOMMITTED,READ-COMMITED,REPEATABLE-READ,SERIALIZABLE
set @@tx_isolation=xxx; // mysql 5.x
set @@session.transaction_isolation=xxx; // mysql 8.x
事务相关命令:
start transaction;
commit;
rollback;
网友评论