JDBC事务隔离级别

读“脏数据”

一个事务读取了另一个事务尚未提交的数据,例如当事务A与事务B并发执行,当事务A更新后,事务B查询读取到事务A尚未提交的数据,此时事务A回滚,则事务B读取到的数据是无效的“脏数据”。

“不可重复读” 

一个事务的操作导致另一个事务前后两次读取到不同的数据,例如当事务A与事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次读取该数据,发现前后两次的数据不一样。

“虚读” 

一个事务的操作导致另个一个事务前后两次查询的结果数量不同。例如,事务A与事务B并发执行时,当事务B查询读取数据后,事务A新增或删除了一条满足事务A的查询条件的记录,此时事务B再次查询,发现查询到前次不存在的记录,或者前次某个记录不见了。以银行存款为例,A存款100元未提交,这时银行做报表进行统计查询账户为200元,然后A提交了,这是银行再统计发现账户为300元,无法判断到底哪个为准?

JDBC事务隔离级别有几种? 

  1. TRANSACTION_NONE JDB: 不支持事务
  2. TRANSACTION_READ_UNCOMMITTED: 未提交读。说明在提交前一个事务可以看到另一个事务的变化。这样(1.读脏数据、2.不可重复读、3.虚读取)都是允许的;
  3. TRANSACTION_READ_COMMITTED:已提交读。说明读取未提交的数据是不允许的。这个级别仍然不可重复读和“虚读”的产生;
  4. TRANSACTION_REPEATABLE_READ:可重复读。说明事务保证能够再次读取相同的数据而不会失败,但是“虚读”任然会存在;
  5.  TRANSACTION_SERIALIZABLE:可序列化。它是最高的事务级别,它防止读“脏”数据、不可重复读和“虚读”。

JDBC开发需要注意哪些问题?

  1.  尽可能使用PreparedStatement。原因是它拥有更高的执行效率、更好的安全性(方式sql注入),也有更好的可读性。当然,在使用PreparedStatement的时候,只有使用占位符(?)才会实现更高效率以及高安全性;
  2. 尽可能关闭自动提交模式。获取数据库的连接Connectin对象后,关闭事务的自动提交模式。自动提交模式为:每次执行一条sql语句,他就会马上提交(应当注意到的是事务的提交也是一个耗时操作),因此,一条SQL语句可以被看成是一个事务。如果关闭自动提交模式,改为显式的调用commit方法提交,可以在执行多条sql语句后再调用commit方法提交,从而提高执行效率。
  3. 要尽可能使用数据库连接池。实际上连接池是一个非常重要的资源,创建于数据库的连接也是一个耗时的操作,使用数据库连接池能够节约不必要的建立数据库连接时间,同时还能够对数据库连接资源进行很好的管理;
  4. 当Statement、Preparestatement、ResultSet等对象使用完成后,应该调用close方法释放掉资源;
  5. 尽可能采用批处理方式执行sql语句,JDBC提供了addBatch方法把sql语句加入到批处理中,然后调用executeBatch方法执行所有的SQL语句,这种方法减少了JDBC与数据库的交互次数,所以具有更好的性能;
  6. 在调用ResultSet的get方法时,尽可能使用列名而不是列索引。当使用列名后,即使select语句列的顺序 有调整也不用改动代码(这一点在笔者大三初学java web,做项目的时候深有体会)。在调用getXXX方法,根据实际的类型选用对应的getXXX方法从而避免类型转换;
  7. 尽可能使用标准的SQL语句,这样有利于代码在不同的数据库之间迁移。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值