事物
什么是事务
事务是指一个工作单元(数据库并发控制的基本单元),它包含了一组数据操作命令,并且所有的命令作为一个整体一起向系统提交或撤消请求操作,即这组命令要么一起成功,要么一起失败。
MYSQL的事务管理
MySQL 的事务由 存储引擎实现,比如 InnoDB。MySQL 的事务管理有两种方式:
手动开启事务
- start transaction; 开启事务。
- 执行多条 sql;
- commit/rollback; 提交或回滚事务。
设置自动提交参数
- show variables like '%commit%'; 查看与 commit 相关参数。
- set autocommit = 0; 将autocommit参数设置为OFF。
- SET AUTOCOMMIT 设置自动提交事务。即每条语句会开启一个事务,并且在执行结束后自动提交。
MySQL 数据库事务默认是自动提交的。Oracle 数据库事务默认是不自动提交。
JDBC中的事务管理
JDBC 的事务的管理的 API: Connection
void setAutoCommit(boolean autoCommit)
将此连接的自动提交模式设置为给定状态。
void commit()
使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。
void rollback()
取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。
DBUtils实现事务管理
没有事务管理:
QueryRunner(DataSource ds)
Constructor for QueryRunner that takes a DataSource to use.
<T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
Executes the given SELECT SQL query and returns a result object.
int update(String sql, Object... params)
Executes the given INSERT, UPDATE, or DELETE SQL statement.
有事务管理:
QueryRunner()
Constructor for QueryRunner.
<T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
Execute an SQL SELECT query with replacement parameters.
int update(Connection conn, String sql, Object... params)
Execute an SQL INSERT, UPDATE, or DELETE query.
事物的特性
原子性:强调事务的不可分割.
一致性:强调的是事务的执行的前后,数据的完整性要保持一致.
隔离性:一个事务的执行不应该受到其他事务的干扰.
持久性:事务一旦结束(提交/回滚)数据就持久保持到了数据库.
事物的作用:事物是为解决数据安全提出的,事物控制实际上就是控制数据的安全访问。
如果不考虑事务的隔离性,引发一些读问题
脏读:一个事务读到另一个事务还没有提交的数据。
不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致在当前的事务中多次查询结果不一致。
虚读/幻读:一个事务读到另一个事务已经提交的insert的数据,导致在当前的事务中多次的查询结果不一致。
解决引发的读问题,设置事务的隔离级别
read uncommitted:未提交读.脏读,不可重复读,虚读都可能发生。
read committed:已提交读.避免脏读.但是不可重复读和虚读有可能发生。
repeatable read:可重复读.避免脏读,不可重复读.但是虚读有可能发生。
serializable:串行化的.避免脏读,不可重复读,虚读的发生。
MYSQL隔离级别:repeatable read Oracle隔离级别:read committed