一、事务知识
- 概念:由一步或几步操作序列组成的逻辑执行单无(要么全部成功,要么全部失败)
- 特性:ACID
1) 原子性:事务是应用中最小的逻辑执行体
2) 一致性:事务的执行结果必须使用数据库的数据保持正确
3) 隔离性:各个事务的执行互不干扰
4) 持续性:事务提交之后,数据的改变要保存进数据库,也叫持久性 - 提交
1) 自动提交:执行DDL或DCL语句或程序正常退出时会自动提交
2) 显示提交:Commit - 回滚
1) 自动回滚:系统错误或强行退出时会自动回滚
2) 显示回滚:rollback
二、MySql的事务支持
- setautocommit = 0 ; // 开启事务(关掉自动提交)
- 临时事务:transaction 或begin 后的DML语句就是临时事务,要在commit后才生效
- 保存中间点:save point a;
- 回滚:rollback;
- 回滚到中间点:rollback to a;
- 提交:commit
注:普通的提交、回滚都会结束当前事务,而回滚到中间点时仍处于事务中
三、JDBC的事务支持
- JDBC的事务支持由Connection提供,默认关闭事务
- Connetion对象关于事务的方法
setAutoCommit(false); // 开启事务
rollback(); // 回滚
commit(); // 提交
SavePoint setSavepoint(); // 设置中间点,一般不指定名称
rollback(SavePoint point); // 回滚到中间点 - 设置中间点时,一般不指定名称是因为回滚到中间点时,是根据中间点对象来回滚的,与名字无关,所以不用指定。
四、事务的隔离级别
- 读未提交:在该级别下,一个事务能读到另一个事务还未提交的事务,即脏读,此级别还会产生不可重复读、幻读这些问题。
- 读提交:一个事务只能读到另一个事务提交后的修改结果,此时会产生不可重复读、幻读等问题。
- 可重复读:一个事务A在读取数据时添加共享锁,在写数据时添加排他锁,这样另一个事务B只能读到A提交后的结果。但此时还会有幻读的问题的存在。
- 序列化:一个事务在对某个范围内的数据进行任何操作时,不允许其他事务对该范围内的数据作任何操作,包括查询。
_ | 级别 | 脏读 | 不可重复读 | 幻读(虚读) |
---|---|---|---|---|
读未提交read uncommitted | 1 | Y | Y | Y |
读提交read committed | 2 | X | Y | Y |
可重复读repeatable read | 4 | X | X | Y |
序列化、串行化Serialization | 8 | X | X | X |
问题描述:
1. 脏读:一个事务读到另一个事务未提交的修改结果
2. 不可重复读:一个事务两次查询同一条语句时,由于另一个事务对该数据的修改提交,从而造成两次查询结果不一致的情况。
3. 幻读:一个事务两次查询同一范围内的数据时,由于另一个事务对该范围内的数据进行了添加、修改或删除等操作,从而造成两次查询结果一致的情况
五、关于锁的部分说明
- 共享锁:又叫读锁,若一个事务对某条数据加了该锁,则其他事务只能查看该条数据
- 排他锁,又叫写锁,若一个事务对某条数据加了该锁,则其他事务不能对该条数据作任何操作,包括查看。
- 表锁、行锁等其他关于锁的知识可百度了解下。