事务

事务:

         就是一件完整的事情,可以包含多个操作单元,这些单元要么全部成功,要么全部失败

         例如:转账

                  包含转出操作和转入操作.(转钱成功——到对方账户;转钱失败——回到自己账户)

 

 

mysql中的事务:

         mysql中事务默认是自动提交,一条sql语句就是一个事务.

                  开启手动事务方式

                          方式1:关闭自动事务.(了解)

                                   setautocommit = off;

                          方式2:手动开启一个事务.(理解)

                                   starttransaction;-- 开启一个事务

                                   commit;--事务提交

                                   rollback;--事务回滚

        扩展:

                  oracle中事务默认是手动,必须手动提交才可以.

 

 

java中的事务:

         Connection接口的api:

                  setAutoCommit(false);//手动开启事务

                  commit():事务提交

                  rollback():事务回滚

                 

         扩展: Savepoint还原点

                  voidrollback(Savepoint savepoint) :还原到那个还原点

                  SavepointsetSavepoint() :设置还原点

 
        如何使用同一个connection

                  1.向下传递

                  2.将连接绑定到当前线程

                          ThreadLocal

                                   set(Objectvalue)

                                   Objectget()

                                   remove()

 

        DBUtils中事务控制QueryRunner:

                  newQueryRunner(Datasource ds):

        //自动事务.调用方法的不需要传入connection,资源不用我们释放.

                  new QueryRunner():

        //手动事务.调用方法的必须传入connection,需要手动提交事务或者回滚事务.必须手动的释放资源

 

事务的特性:

         ACID

         1.原子性:事务里面的操作单元不可切割,要么全部成功,要么全部失败

         2.一致性:事务执行前后,业务状态和其他业务状态保持一致.

         3.隔离性:一个事务执行的时候最好不要受到其他事务的影响

         4.持久性:一旦事务提交或者回滚.这个状态都要持久化到数据库中

 

         不考虑隔离性会出现的读问题

         1.脏读:在一个事务中读取到另一个事务没有提交的数据

         2.不可重复读:在一个事务中,两次查询的结果不一致(针对的update操作)

         3.虚读(幻读):在一个事务中,两次查询的结果不一致(针对的insert操作)

                  通过设置数据库的隔离级别来避免上面的问题

                  readuncommitte    读未提交        上面的三个问题都会出现

                  readcommitted      读已提交        可以避免脏读的发生

                  repeatableread      可重复读        可以避免脏读和不可重复读的发生

                  serializable              串行化             可以避免所有的问题

        

        

                  1.演示脏读的发生:

                           将数据库的隔离级别设置成读未提交

                                   setsession transaction isolation level read uncommitted;

                          查看数据库的隔离级别

                                   select@@tx_isolation;

                  2.避免脏读的发生,将隔离级别设置成  读已提交

                          setsession transaction isolation level read committed;

                          不可避免不可重复读的发生.                  

                  3.避免不可重复读的发生经隔离级别设置成可重复读

                           set session transaction isolationlevel  repeatable read;                          

                  4.演示串行化可以避免所有的问题

                          setsession transaction isolation level serializable;

                          锁表的操作.

                 

         四种隔离级别的效率

                  readuncommitted>read committed>repeatable read>serializable

         四种隔离级别的安全性

                  readuncommitted

         开发中绝对不允许脏读发生.

                  mysql中默认级别:repeatable read

                  oracle中默认级别:read committed

 
java中控制隔离级别 :

                Connectionapi

                voidsetTransactionIsolation(int level)

                level是常量

你可能感兴趣的:(transaction,transaction)