show variables like’%commit%’; 查询提交属性
set autocommit = off; 设置自动提交关闭
start transaction; 开启事务
rollback; 回滚事务
commit; 提交事务
代码中通过conn.setAutoCommit(false); 关闭自动提交的设置。
通过conn.commit(); 提交事务
通过conn.rollback(); 回滚事务
事务的特性(ACID):
原子性:事务中包含的逻辑不可分割
一致性:事务执行前后整体数据的完整
隔离性:事务执行期间不受其他事务的影响
持久性:事务执行成功,数据永久保存到磁盘
事务的安全隐患:
1.关于读的方面:
脏读-----一个事务读到了另一个事务还未提交的数据。
不可重复读------一个事务读到了另一个事务提交的数据,造成前后两次读取的数据不一致。
幻读-------一个事务读到了另一个insert的数据,造成前后查询结果不一致。
2.关于写的方面:
丢失更新------一个事务提交造成另一个事务修改的信息被覆盖,或者是因为事务的回滚造成另一个事务修改的信息被覆盖。
事务的隔离级别
1.Read Uncommitted 读未提交
2.Read Committed 读已提交
3.Repeatable Read 重复读
4.Serializable 可串行化
mysql的隔离级别是 可重复读
oracle的隔离级别是 读已提交
按效率来说,由高到低:
读未提交》读已提交》重复读》可串行化
按照拦截程度,由高到低:
可串行化》重复读》读已提交》读未提交
可串行化:如果有一个连接的隔开级别设置为串行化,那么谁先打开了事务,谁就有了先执行的权力,谁后打开事务,谁就只能等着,等前面的那个事务提交或者回滚后,才能继续执行。但是这种隔离级别一般比较少用,容易造成性能上的问题,效率比较低。
查看隔离级别
select @@tx_isolation;
设置当前会话 读未提交
set session transaction isolation level read uncommitted;
悲观锁:一定会发生丢失更新
例子:select * from account for update;
for update就是数据库锁机制,排它锁。加上他之后,A事务在进行查询时,B事务会卡住。
乐观锁:一定不会发生丢失更新
例子:程序员自己给每条数据添加一条属性,A事务提交,属性发生改变。当B事务准备提交时,对比数据库的这个属性和自身的属性是否一致,不一致不允许提交,让其先更新数据。