JDBC事务隔离级别主要是用在并发的情况下
JDBC事务隔离级别:(各个数据库不一样,以下级别递增)
1、TRANSACTION_NONE 表示不支持事务,这个就不解释了
2、TRANSACTION_READ_UNCOMMITTED 允许看到未提交事务,也就是说会出现脏读
A更新了一条记录,但是还未提交事务,这时B查看同一张表能够看到A更新的数据,当然要是之后A提交了事务,那不会造成太大问题,但是万一A在B查询到这条更新的数据 后又回滚了事务,那么也就是说实际上没有更新这条数据,但是B却读到了这条数据,这就是所谓脏读,要解决脏读,使用下一个事务隔离级别
3、TRANSACTION_READ_COMMITTED 读提交(大部分数据库默认是这个,oracle,sqlserver)
只有当事务提交之后更新的数据才能被其他事务读取到,自然避免了脏读,但是还是有一个问题,举个现实的例子:A查到他的银行账户里有2000块钱,但是这时他的妻子B在 网上转账,将这2000元钱转出了,这时A想要刷卡消费,却显示余额不足,A很奇怪:明明有钱的呀? 问题出在哪里?就是因为A开启了一个事务之后,他的妻子又开启了一个 事务,而且妻子开启的事务在A之前修改了数据库。那么要怎么解决?请看下一个级别
4、TRANSACTION_REPEATABLE_READ 读重复(mysql默认是这个,安全级别真高。。)
针对读提交出现的“不可重复读”问题,只需要在A开启一个事务后,其他人开启的事务无法对数据进行修改就可以了。
但是这还是存在一个问题:其他人是无法进行修改了,但是要是A修改了,而其他人正好在查询呢?比如A查询后发现银行卡中有2000元,这时他妻子也进行查询这个月的消费情 况是1000元,然后A又进行了消费,消费1000元,然后妻子打印凭条的时候发现消费了2000元,妻子很奇怪。。。。。。也就是说读重复只是控制了除第一个开启事务以外的其 他用户修改,但是要是反过来呢?第一个开启事务的用户是可以修改的,要是他修改了会造成其他用户的幻读
5、TRANSACTION_SERIALIZABLE 序列化
级别最高,事务顺序执行。。。。
以上的事务级别顺序提高,安全性自然是越来越提高,但是效率显然也是越来越低