1.什么是事物?
事物是逻辑上的的一种操作,这个操作过程中的每一个元素要么全部成功,要么全部失败.例如,银行转账过程视为一个事物,转出过程和转入过程要求全部成功或全部失败,通过提交事物或者回滚事物实现.
2.事物的作用
保证一组操作中要么全部成功,要么全部失败.
3.事物的特性(重要)
ACID
Atomicity 原子性:是指事物是一个不可分割的工作单位事物的操作要么全部成功,要么全部失败
Consister 一致性:事物前后数据的完整性保持一致(例如银行转账,转出账号少多少钱,转入账号就需要多多少钱)
Isolation 隔离性:是指多个用户并发访问时候,彼此不会产生影响
Durability 持久性:是指事物一旦被提交,他对数据库的改变时永久性的.
4.事物的操作
A:mysql事物操作
开启事物 start transaction
提交事物 commit
回滚事物 rollback
注:事物只有回滚或者提交时才会执行
mysql中有两种方式管理事物
1)手动提交
start transaction; sql语句操作数据库; commit;
2)自动提交
set autocommit = 0; ---- 0 :off 1:on
B:jdbc事物操作 --- 通过Connection对象方法操作
开启事物:connection对象.setAutoCommit=false;
提交事物:connectin对象.commit();
回滚事物:connection对象.rollback();
注:通畅将事物操作的代码放到try catch中,当异常发生时回滚事物
C:DBUtils操作事物
开启事物:conn.setAutoCommit=false
提交事物:DBUtils.commitAndClose(conn)
回滚事物:DBUtils.rollbackAndClose(conn)
注:new Query()时,不传递参数
5.并发访问问题及解决方式
并发访问问题:
脏读:事物A读取到事物B为提价的数据
不可重复读:事物A还未提交时,但事物B已经提交改变了数据库时,A重复读数据库的数据为事物B修改后的数据(因为事物A未提交数据,它重复读取数据时应该为开启事物时数据)
虚读/幻读:于不可重复读相似.更侧重于读取的数据不一致.
解决方式: ---- 设置数据库的隔离级别
1.read uncommitted 读未提交;
2.read committed 读已提交: 可解决脏读问题
3.repeatable read 可重复度: 可解决问题 脏读和不可重复读
4.serializable 串行化 同时只能执行一个事物,相当于事物中的单线程
安全性能对比:
安全:
serializable > repeatable read > read committed > read uncommitted
性能;
serializable < repeatable read < read committed < read uncommitted
#####常见的查询操作
cmd命令查询当前事物的隔离等级:select @@tx_isolation;
设置当前事物的隔离等级:set session transaction isolation level 隔离等级;
查看当前是否为自动提交:show variables like '%commit%';