事务的特性:
-
-
一致性(Consistency)事务前后数据的完整性必须保持一致。转账(减钱,加钱)
-
隔离性(Isolation)事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
-
并发访问问题(不考虑隔离性):
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,不会出现上面的几种情况,虽然安全,但是效率不高。
一般使用的时候,根据Connetion连接对象设置参数:
数据库连接对象.setTransactionIsolation(参数);
参数:1,2,4,8