首页 > 编程语言 >java中如何修改事务的隔离级别

java中如何修改事务的隔离级别

时间:2022-10-31 12:39:03浏览次数:41  
标签:事务 TRANSACTION java 隔离 level Connection 级别


事务的特性:

  • 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 (多条语句要么都成功,要么都失败。)
  • 一致性(Consistency)事务前后数据的完整性必须保持一致。转账(减钱,加钱)
  • 隔离性(Isolation)事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
  • 持久性(Durability)持久性是指一个事务结束(一旦被提交或者回滚),它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

并发访问问题(不考虑隔离性):

1.脏读:A事务读取到B事务未提交或是已经提交的数据。

2.不可重复读:A事务读取到B事务已经提交的数据。导致A事务多次查询出来数据不一致。

3.虚读/幻读:A事务读取到B事务已经提交的数据。导致A事务多次查询出来数据不一致。这种情况比较少见,操作一万次还不一定能够遇见一次。

事务的隔离级别:

Java API,事务的隔离级别大致分为4种。在接口Connection中的setTransactionIsolation方法可以设置事务的隔离级别。

void setTransactionIsolation(int level) throws SQLException

试图将此 ​​Connection​​​ 对象的事务隔离级别更改为给定的级别。可能的事务隔离级别是 ​​Connection​​ 接口中定义的常量。

注:如果在事务处理期间调用此方法,则结果由实现定义。

参数:

​level​​​ - 以下 ​​Connection​​​ 常量之一:​​Connection.TRANSACTION_READ_UNCOMMITTED​​​、​​Connection.TRANSACTION_READ_COMMITTED​​​、​​Connection.TRANSACTION_REPEATABLE_READ​​​ 或 ​​Connection.TRANSACTION_SERIALIZABLE​​​。(注意,不能使用 ​​Connection.TRANSACTION_NONE​​,因为它指定了不受支持的事务。)

抛出:

​SQLException​​​ - 如果发生数据库访问错误,在关闭的连接上调用此方法,或者给定参数不是 ​​Connection​​ 常量之一.

详细介绍下:

首先在数据库查看下自己数据库的隔离级别:

show variables like '%isolation%'; 或 select @@tx_isolation;

void setTransactionIsolation(int level),level的参数分别是,1,2,4,8; mysql默认隔离级别是:4 oracle默认隔离级别是:2

Connection.TRANSACTION_READ_UNCOMMITTED :

​           level=1,会出现,脏读,不可重复读,虚读/幻读等情况。​

Connection.TRANSACTION_READ_COMMITTED: 

​           level=2,会出现,不可重复读或是虚读/幻读。 ​

Connection.TRANSACTION_REPEATABLE_READ :   

                               level=4,会现虚读/幻读,可惜是万分之一的概率,我操作的时候,一次没有遇见过,尴尬。

Connection.TRANSACTION_SERIALIZABLE :  ​

​           level=8,不会出现上面的几种情况,虽然安全,但是效率不高。​

java如何设置呢?

一般使用的时候,根据Connetion连接对象设置参数:


数据库连接对象.setTransactionIsolation(参数); 参数:1,2,4,8

标签:事务,TRANSACTION,java,隔离,level,Connection,级别
From: https://blog.51cto.com/u_12277263/5809075

相关文章