学习网站建设多少钱,中国风html5网站模板,电脑软件下载官方网站,网址大全123设为主页首先#xff0c;我们下面说的数据库事务#xff0c;都是使用INNODB引擎的结果。 MYISAM是没有事务的#xff0c;也就没有下面这些说法。
1.数据库事务的四大特性#xff1a;
原子性#xff1a;事务包含的所有数据库操作要么全部成功#xff0c;要不全部失败回滚一致性我们下面说的数据库事务都是使用INNODB引擎的结果。 MYISAM是没有事务的也就没有下面这些说法。
1.数据库事务的四大特性
原子性事务包含的所有数据库操作要么全部成功要不全部失败回滚一致性一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说假设用户A和用户B两者的钱加起来一共是100块那么不管A和B之间如何转账转几次账事务结束后两个用户的钱相加起来应该还得是100块这就是事务的一致性。隔离性一个事务未提交的业务结果是否对于其它事务可见。级别一般有read_uncommitread_commitread_repeatableSerializable。持久性一个事务一旦被提交了那么对数据库中数据的改变就是永久性的即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
了解上面的数据库事务四大特性后我们就知道数据库事务的隔离级别有4个由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable。
2.这四个隔离级别分别可以解决下面这几类问题。
设置事务隔离级别为脏读不可重复读幻读Read uncommitted会出现会出现会出现Read committed不会出现会出现会出现Repeatable read不会出现不会出现会出现Serializable不会出现不会出现不会出现
Serializable就是强制串行化相当于让数据库只能单线程访问所以上面这些问题都不会出现但效率实在太低所以一般不会考虑将数据库隔离级别设置成Serializable。Read uncommitted又对事务放的太宽了如果将数据库的隔离级别设置成Read uncommitted那么各个事务之间就会各种乱搞乱读那么基本上程序就会出现各种大bug所以一般也不会将数据库隔离级别设置成Read uncommitted。
3.常见的数据库默认的事务隔离级别
oracle的默认隔离级别Read committed所以默认下可能会出现不可重复读和幻读的问题。mysql的默认隔离级别是Repeatable read所以默认下可能出现幻读读问题。
4.解释下常见的这几类问题
脏读 事务一对一条数据做了修改但并未提交或者回滚的时候事务二读到了这个事务一已经修改的数据但是由于这条数据是否真的要修改事务一还并没有确定事务二就读到了所以我们可以说事务二读到了脏数据这种问题就叫脏读。 举个例子数据库中有一条数据a1此时事务一做了修改a2但并未提交 如果此时事务的隔离级别是Read uncommitted的话那么此时事务二再读a的值就会读到2那么如果此时事务一又回滚了那么数据库真实的a的值还是1但对于事务二来说已经错了因为事务二读到了2。 如果此时事务的隔离级别是Read committed或Repeatable read或Serializable那么事务二读到的a的值就还是1。不可重复读 一个事务重复两次读取一条数据的中间另一个事务对这条数据做了修改导致第一个事务的两次读的结果出现不同。 举个例子小李买东西的时候刷银行卡一开始系统查到账户余额200元于是准备开始执行扣款于此同时小李老婆刚好在另外一个地方将这200元取走了从而导致小李这边扣款失败这就是不可重复读的问题。 注意 mysql的默认隔离级别下是不会出现这种问题的 oracle的默认隔离级别下会出现这种问题。幻读 一个事务以相同的条件查询以前检索过的数据一般指查询数据条数的时候由于其他事务对某些数据做了增或者删导致第一个事务查出来的总条数和以前的结果不同了这叫幻读。 其实一般情况的业务下幻读是可以接受的所以我个人认为幻读不算什么问题吧。 而且mysql和oracle的默认隔离级别下也都会出现这个幻读的现象。 如果非要解决幻读无非就是加个表级别的锁这样效率太差了而且一般都没必要。
5.mysql 对隔离级别的查询和设置
查询隔离级别 SHOW VARIABLES LIKE ‘tx_isolation’;
设置隔离级别 SET GLOBAL tx_isolation‘REPEATABLE-READ’; SET SESSION tx_isolation‘SERIALIZABLE’;
GLOBAL是全局SESSION是当前会话如果没有指定默认是SESSION。