什么是事务
事务指的是逻辑上的一组操作,组成这组操作的各个逻辑单元要么一起成功,要么一起失败.
MYSQL的事务的管理
创建一个账号的表:
create database web_13;
use web_13;
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
insert into account values (null,'张森',10000);
insert into account values (null,'凤姐',10000);
insert into account values (null,'如花',10000);
MYSQL的事务管理有两种方式:(MYSQL数据库事务默认是自动提交的.Oracle数据库事务默认是不自动提交)
* 1.手动开启事务
* start transaction; -- 开启事务
* 多条sql;
* commit/rollback;
* 2.设置一个自动提交参数
* show variables like '%commit%'; -- 查看与commit相关参数.
* set autocommit = 0; -- 将autocommit参数设置为OFF.
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