传智播客JavaWeb day11--事务的概念、事务的ACID、数据库锁机制、
1. 什么叫做事务?
2.默认情况下每一条sql语句都是一个事务,然后自动提交事务 ps:如果想多条语句占一个事务,则可以手动设置SetAutoCommit为false
3.关键字 start transaction;rollback;commit
3.1 练习 创建account表(id,name,money),插入两条数据(a,b);start transaction;set a+100,set b-100;commit rollback
create table account( id int primary key auto_increment, name varchar(20), money double //在MySQL中没有money类型 ); insert into account values(null,'a',1000),(null,'b',1000) start transaction update account set money = money -100 where name='a'; update account set money = money +100 where name='b'; commit;
4.jdbc中事务管理
5. 设置回滚点
6.事务的四大特性(ACID)
总结:这一节主要讲了事务的概念;jdbc中使用事务;事务的四大特性
二、隔离性
事务的四大特性,前三点数据库能很好的帮我实现,我们重点来谈下隔离性。
ps:如果用单线程来实现隔离性的话(也就是用lock的方式),会降低数据库的性能和效率
1.不考虑隔离性可能造成的问题 ps:我们只要考虑这三个方面的问题两个人同时修改,两个人同时读,一读一改,这三种情况都考虑到了那么所有的问题都考虑到了
1.1 两个人同时修改
用lock来解决两个人同时修改的线程安全问题
1.2 两个人同时读
两个人同时读不存在线程安全问题
1.3 一读一改 ps:一读一改会出现三个问题:脏读、不可重复读、虚读
1.3.1 脏读
脏读就是读到了其他事务没有提交的数据 ps:比如a(淘宝买家)、b(淘宝卖家),a开启事务向b打了100块钱但是事务还未提交然后告诉b说我已经向你支付了100请你发货,这个时候b去账户查了一下果然多了100块于是给a发了货,但是这个时候a做了rollback操作,结果b亏了100钱的货(事务举例常用银行转账跟购物)
b卖家进行的操作: select @@tx_isolation; set transaction isolation level read uncommitted; start transaction; //b一直在等待a付款,当a付款后告诉b发货时b去查了一下自己的账号 select * from account where name='b'; //这个时候b发现自己的账户中确实多了100快,当时万万没有想到此时a做了rollback的操作 a买家进行的操作: start transaction; update account set money = money -100 where name='a'; update account set money = money +100 where name ='b'; //这个时候a告诉卖家b说我已经给你打款了,你赶快给我发货吧 //当b发货之后a做了rollback的操作 rollback;