1:什么是事物?
事务是用户定义的一个数据库操作序列,这些操作要么全都做,要么全都不做,是一个不可分割的工作单元。在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。:2:事物概念
MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关的。
-MyISAM:不支持事务,用于只读程序提高性能
-InnoDB:支持ACID事务、行级锁、并发
-Berkeley DB:支持事务
2:事物的特性
事务必须具备以下四个属性,简称ACID 属性:
原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行
一致性(Consistency):当事务完成时,数据必须处于一致状态
隔离性(Isolation):事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性
3:Mysql中的事物控制
MYSQL中,默认事务是自动提交的,即一条sql语句就是一个事务
改变事务提交方式
SET AUTOCOMMIT=1(默认) #自动提交事务
SET AUTOCOMMIT=0 #手动提交事务
如果想多条sql放在一个事务中执行,则需要使用如下语句。
START TRANSACTION #开启事务
COMMIT #提交事务
ROLLBACK #回滚事务
SAVE POINT 回滚点 #设置回滚点
:4:事物的隔离级别
多个线程开启各自事务操作数据库中数据时,数据库系统要负责
隔离操作,以保证各个线程在获取数据时的准确性。
如果不考虑隔离性,可能会引发如下问题
1:脏读(dirty reads)
一个事务读取了另一个未提交的并行事务写的数据。
2:不可重复读(non-repeatable reads)
一个事务重新读取前面读取过的数据, 发现该数据已经被另一个已
提交的事务修改过。
3:幻读(phantom read)
一个事务重新执行一个查询,返回一套符合查询条件的行, 发现这
些行因为其他最近提交的事务而发生了改变
4:事物的隔离性
脏读:一个事务读取到了另一个未提交的数据
不可重复读:在一个事务内读取表中某一行数据,多次读取结果不同
虚读(幻读):指在一个事务内读取到了别的事务插入的数据,导致前后不一致
5:事物隔离性的设置语句
数据库共定义了四种隔离级别:
- Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
- Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免幻读
- Read committed:可避免脏读情况发生(读已提交)
- Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
- select @@tx_isolation 查询当前事务隔离级别
- set [global/session] transaction isolation level 设置事务隔离级别
MYSQL演示三种缺点
7:Java的JDBC中事物实现
JDBC控制事务语句
conn.setAutoCommit(false); // 相当于start transaction
//执行事务SQL语句
conn.commit(); // commit
conn.rollback(); //rollback
设置事务回滚点
Savepoint sp = conn.setSavepoint();
//事务SQL语句
conn.rollback(sp);
conn.commit(); //回滚后必须要提交