返回顶部

事物

什么是事务

事务是指一个工作单元(数据库并发控制的基本单元),它包含了一组数据操作命令,并且所有的命令作为一个整体一起向系统提交或撤消请求操作,即这组命令要么一起成功,要么一起失败。

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

 

posted @ 2017-11-03 00:03  jaden好青年  阅读(129)  评论(0编辑  收藏  举报