TIP 事物

    技术2026-08-15  17

    事物是指逻辑上的一组操作,组成这组操作的各个单元要么成功,要么全部不成功。

    例如:A----B转账,对应于如下两个SQL语句。

    update from account set money=money+100 where name='b';

    update from account set money=money-100 where name ='a';

    数据库开启事物命令

    start transaction 开启事物

    Rollback 回滚事务

    Commit 提交

     

    当JDBC向数据库获得一个Connection对象时,默认情况下这个Connection会自动向数据库提交在他上面发送的SQL语句,要关闭SQL语句,让多条在同一事物中执行,可使用的语句是:JDBC控制的Connection.setAutoCommit(false), 将此连接的自动提交模式设置为给定状态,Coinnection.rallback(),取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁,Connection.commit(),使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁;

    设置事物的回滚点:SavePoint sp =conn.setPoint(),  在当前事务中创建一个未命名的保存点 (savepoint),并返回表示它的新 Savepoint 对象,conn.rallback(sp),在当前事务中创建一个具有给定名称的保存点,并返回表示它的新 Savepoint 对象,conn.commit();回滚后的提交,这个点就是SavePoint sp =conn.setPoint(), 下面的Sql(异常前面的),

    事物的特性:ACID(Atomocity,Consistency,IsoLation,Durability)即原子性、一致性、隔离性、持久性。

    最困难的是:食物的隔离级别

    多个线程开启各自事物操作数据库中数据时,数据库系统要负责隔离操作,以保证各个线程在获取事物的准确性,

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

    脏读:就是一个事务提交了另一个事物未提交的额数据,set transaction isolation level设置事物的隔离级别。不可重复读,在一个事物类读取表中的一行数据,多次读取的数据不一样。虚度,在一个事物内读到了别的事物插入的数据,导致前后结果不一致。

    数据库的隔离级别:Serilzable,一切可以避免,Repeadtable read:可重读,Read commited,读已经提交,Read uncommitted:什么都无法保证。select @@tx_isolation查询当前事物的隔离级别。隔离级别越高,性能越差。每一个连接到对象上都可以设置自己的隔离级别。 Connection这个类里面的用代码实现。

     

     

    最新回复(0)