事务的特性:
- 原子性(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