Java知识点总结(JDBC-事务)
@(Java知识点总结)[Java, JDBC]
事务
事务基本概念
- 一组要么同时执行成功,要么同时执行失败的 SQL 语句。是数据库操作的一个执行单元!
-
事务开始于:
- 执行 commit 或 rollback 语句。
- 执行一条 DDL 语句,例如 create table 语句;在这种情况下,会自动执行 commit 语句。
- 执行一条 DCL 语句,例如 grant 语句;在这种情况下,会自动执行 commit 语句。
- 断开与数据库的连接。
- 执行了一条 DML 语句,该语句却失败了;在这种情况下,会为这个无效的 DML 语句执行 rollback 语句。
事务的四大特点(ACID)
-
atomicity(原子性)
- 表示一个事务内的所有操作是一个整体, 要么全部成功,要么全失败
-
consistency(一致性)
- 表示一个事务内有 一个操作失败时 ,所有的更改过的数据都必须 回滚到修改前的状态 ;
-
isolation(隔离性)
- 事务查看数据时 数据所处的状态 ,要么是另一并发事务 修改它之前 的状态,要么是另一事务 修改它之后 的状态,事务不会查看中间状态的数据。
-
durability(持久性)
- 持久性事务完成之后,它对于系统的 影响是永久性的 。
事务并发处理可能引起的问题
- 读脏(dirty read):一个事务读取了另一个事务尚未提交的数据,
- 不可重复读(non-repeatable read):一个事务的操作导致另一个事务前后两次读取到不同的数据
- 幻读(phantom read):一个事务的操作导致另一个事务前后两次查询的结果数据量不同。
隔离级别
4个等级的事务隔离级别,在相同的数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可以导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力是不同的。
-
SERIALIZABLE(串行化)
- 不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
性能最差
-
REPEATABLE READ(可重复读)(MySQL)
- 防止脏读和不可重复读,不能处理幻读
- 性能比SERIALIZABLE好
-
READ COMMITTED(读已提交数据)(Oracle)
- 防止脏读,不能处理不可重复读和幻读;
- 性能比REPEATABLE READ好
-
READ UNCOMMITTED(读未提交数据)
- 可能出现任何事物并发问题,什么都不处理。
- 性能最好
MySQL隔离级别
MySQL的默认隔离级别为Repeatable read,可以通过下面语句查看:
SELECT @@`TX_ISOLATION`;
也可以通过下面语句来设置当前连接的隔离级别:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ ;//[4选1]
JDBC设置隔离级别
con.setTransactionIsolation(int level) :参数可选值如下:
Connection.TRANSACTION_READ_UNCOMMITTED;Connection.TRANSACTION_READ_COMMITTED;Connection.TRANSACTION_REPEATABLE_READ;Connection.TRANSACTION_READ_SERIALIZABLE。