事务与事务隔离级别的含义

1
2
3
4
5
1.事务即数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元)
2.事务并发会引发脏读,不可重复读和幻读,事务隔离即是解决此类问题的方法
3.低级的事务隔离级别支持更高的并发操作,系统代价也比较小
4.慎重使用过于高级的事务隔离级别
5.JDBC代码修改的事务隔离级别是只针对数据库层面的

脏读

1
指一个事物读取了另一个事物尚未提交的数据

**例如: **

1
2
小明的银行卡中有1000元,由于不够交学费,小明同家里联系让家人汇500元到小明的银行卡中.小明的爸爸就在手机上的转账到银行卡给小明汇了500元,并告诉小明钱已经汇过去了,当小明进入查看余额页面时,银行卡中的余额显示有1500元,但是汇款系统操作失败了,自动回滚了事务,系统将小明的爸爸给小明汇到银行卡的500元退回了小明爸爸的账户中,而此时小明又再次查看银行卡中的余额时,余额又变回了1000元,所以小明就跟他爸爸说刚汇过来的钱没了
解决方法: 在一个事务提交前,任何其他事物都不可以读取其修改过的值

不可重复读

1
一个事务的操作导致另一个事务前后两次读取的数据不同

**例如: **

1
2
小王的实习工资是1800元,财务在发放小明工资的时候,将小明的工资改成了2800元,但没有结束这个事务,此时小王查看了自己的工资,发现工资不是说好的2500元,反而多了300元,很高兴,而财务刚好发现了自己输入的金额错误了,赶紧回滚了事务,小王的工资又变回了1800元,此时小王查看到的银行卡余额又变成了1800元,而另一个事务中财务再次修改了小王的工资,并提交了事务,当小王再次查看时,工资又变成了2500
解决方法: 只有在修改的事务完全提交之后,才允许读取数据

幻读

1
一个事务的操作会导致另一个事物前后读取的结果不同

**例如: **

1
2
财务在查看实习员工的员工信息时,系统显示出10个员工的员工信息,此时人力资源的工作人员将一名新员工的个人信息录入到了系统中,财务再次查看实习员工的员工信息时,系统显示出了11个员工的员工信息
解决方法: 在操作事务完成数据处理之前,任何事物都不能添加新数据

事务的隔离级别

1
2
3
4
5
6
1.读取未提交: TRANSACTION_READ_UNCOMMITTED, 允许脏读,不可重复读和幻读
2.读取提交: TRANSACTION_READ_COMMITTED,禁止脏读,但允许不可重复读和幻读
3.可重复读: TRANSACTION_REPEATABLE_READ,禁止脏读和不可重复读,但允许幻读
4.可串化: TRANSACTION_SERIALIZABLE,禁止脏读,不可重复读和幻读
5.TRANSACTION_NONE的含义是JDBC驱动不支持事务
6.MySQL的数据库隔离级别是可重复读,Oracle的是读取提交

事务隔离级别过高的危害

1
例如设置可串化,禁止脏读,不可重复读和幻读.当一个事务在操作时,会导致其他事物等待,但保持连接,如果该事务持续时间很长,而这段时间又加入了很多事务,会导致连接数过高,并且数据库服务器有连接数上限,当连接数到达上限后其他的连接就无法建立,这样会导致前台的业务操作无法继续