(6)事务的详解(transation)

2018-10-14  本文已影响0人  Mrsunup

上一篇讲解到ResultSet对象的一些操作,就有提及自动事务的关闭和开启,以及发生异常的时候的事务的回滚
对应着下面的方法:

  connection.setAutoCommit(false);
  connection.commit();
  connection.rollback();
  connection.setAutoCommit(true);
  //设置回滚点
  Savepoint save1 = connection.setSavepoint();
  //回滚到设置的回滚点
   connection.rollback(save1);

回滚点的设值案例不在详细描述,详细请参考:https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html#set_roll_back_savepoints

参考的文章:https://www.cnblogs.com/melody210218/p/7120559.html

1.数据库必须具备的四个特性

2.事务的隔离级别

隔离性:当多个线程都开启事务来操作数据库中的数据时,数据库系统要进行隔离操作,以保证各个线程获取数据的准确性。 不考虑事务的隔离性,会产生的几种问题:

数据库提供的四种隔离级别:

注: 四种隔离级别最高:Seralizable级别,最低的是Read uncommitted级别; 级别越高,执行效率就越低; 隔离级别的设置只对当前链接有效,对JDBC操作数据库来说,一个Connection对象相当于一个链接,只对该Connection对象设置的隔离级别只对该connection对象有效,与其它链接connection对象无关。

Mysql的默认隔离级别是:可重复读:Repeatable read;
0oracle数据库中,只支持seralizable(串行化)级别和Read committed();默认的是Read committed级别;

3.设置数据库的事务隔离级别

可以使用Connection.setTransactionIsolation方法设置事务的隔离级别,不是所有的数据库支持不同的事务隔离级别

//验证mysql的支持数据隔离级别:
//设置事务隔离级别 con.setTransactionIsolation();
System.out.println("defalut TransactionIsolation"+ con.getTransactionIsolation());
System.out.println("Supports TRANSACTION_NONE? "+ dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_NONE));
System.out.println("Supports TRANSACTION_READ_UNCOMMITTED? "+ dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_UNCOMMITTED));
System.out.println("Supports TRANSACTION_READ_COMMITTED? "+ dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_COMMITTED));
System.out.println("Supports TRANSACTION_REPEATABLE_READ? "+ dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ));
System.out.println("Supports TRANSACTION_SERIALIZABLE? "+ dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE));

/**
 *输出的结果为:
 * defalut TransactionIsolation ? 4
 * Supports TRANSACTION_NONE? false
 * Supports TRANSACTION_READ_UNCOMMITTED? true
 * Supports TRANSACTION_READ_COMMITTED? true
 * Supports TRANSACTION_REPEATABLE_READ? true
 * Supports TRANSACTION_SERIALIZABLE? true
 *默认的是 支持可重复读
 * mysql 支持下面四种数据库隔离级别
 */

4.四种隔离级别进行场景设计

总结:

  • 读未提交:就相当于A读了B没有提交的事务,会发生脏读
  • 读已提交的事务:解决脏读,但是会发生不可重复读的情况,就是两次读取不一样,中间被另外的事务进行了修改
  • 可重复读:可以解决不可重复读的情况,就是通过开启事务,在读取的过程中不能修改记录,这个相当于行级锁,不能修改读取的记录,以避免不可重复读的情况
  • 别串性化:可以解决幻读的情况,之所以是幻读,就是修改了全部记录的后,有事务新增了记录,导致了幻读,使用串性化,就相当于表级锁,使得无法对表进行新增记录
上一篇下一篇

猜你喜欢

热点阅读