原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分 
  一致性:在事务处理执行之前和之后,数据是一致的。 
  隔离性:一个事务处理对另一个事务处理没有影响。 
  持续性:当事务处理成功执行到结束的时候,其效果在数据库中被永久纪录下来。 原子性我能理解,一致性和隔离性怎么理解啊,哪位高手能举例解释一下?
在Java中能在一个事务中设置回滚点,可以回滚到事务的某个位置,这个和事务的原子性相违背吗?
一个事务是在调用tx.commit()或tx.rollback()结束的吗?

解决方案 »

  1.   

    楼主先弄明白事务的定义。在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态,对数据库的增删改查都是事务操作。理解了事务的含义。理解应该不难了吧  原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分   一致性:在事务处理执行之前和之后,数据是一致的。 
            -- 插入数据A, 写进数据还是A,不会变成B  隔离性:一个事务处理对另一个事务处理没有影响。
           -- 事务A 增加数据,事务B删除数据, 互相不影响  持续性:当事务处理成功执行到结束的时候,其效果在数据库中被永久纪录下来。 
           -- 插入数据库的数据写到了磁盘,就是永久了
      

  2.   

    to 1#   没能彻底理解
    原子性
    在Java中能在一个事务中设置回滚点,可以回滚到事务的某个位置,这个和事务的原子性相违背吗?是采用事务嵌套来做的吗?一致性是不是说   
    在一个事务中读取某个数据时,这个数据正好在其他事务中被修改,在其他事务未提交前,这个事务都无法读取到其他事务修改后的数据。如果读取到了,其他事务回滚,这就是脏读,即不一致。隔离性没理解:
    事务A删除了数据,事务B更新这个数据,有影响持续性
    什么时候标识数据库发生物理变化,commit?
      

  3.   

    隔离性
    事务A对某个TABLE进行读取,此后B事务对TABLE进行了修改,可在事务A中并看不到B事务所作的修改,读取到的仍然是查询开始那一刻的数据,B对A没有产生影响。持续性
    持续性就是说事务的修改永久的保存在了数据文件中。至于什么时候发生物理变化,也就是说具体什么时候修改被写入磁盘上的数据文件,有很多种条件下都会促使DBWR去写数据文件。
    COMMIT了只是保证REDO写入到了REDO LOG,并不能保证数据写入数据文件中。
      

  4.   

    光看字是最不好理解的了,楼主可以自己试下就明白了
    看下边的测试:开了俩连接,在第一个连接进行如下操作:
    SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 ok
             2 noSQL> delete from test01;                                                                            2 rows deleted.SQL> select * from test01;                                                                          no rows selected
    没有commit;
    这个时候在第二个连接查看一下数据:
    SQL> show user                                                                                      
    USER is "SCOTT"
    SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 ok
             2 no
    数据仍然在,一致性!
    update一下,看看会怎么样,其实不说也明白,会等待,因为另一个连接持有锁
    SQL> update test01 set name = 'test';等在这里了......
    去另一边commit一下
    SQL> update test01 set name = 'test';                                                               0 rows updated.SQL> select * from test01;                                                                          no rows selected
    0条更新......没数据了,插几条进去看看
    SQL> insert into test01 values (1,'test1');                                                         1 row created.SQL> insert into test01 values (2,'test2');                                                         1 row created.SQL> insert into test01 values (3,'test3');                                                         1 row created.SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 test1
             2 test2
             3 test3
    没有commit;
    去另一边看看
    SQL> select * from test01;                                                                          no rows selected
    这边也+几条数据看看SQL> insert into test01 values(4,'test4');                                                          1 row created.SQL> insert into test01 values(5,'test5');                                                          1 row created.SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             4 test4
             5 test5
    看不到另一边的数据,隔离性!
    在另一边commit一下,然后再看:
    SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 test1
             2 test2
             3 test3
             4 test4
             5 test5
    都看到了,持续性!
    例子弄的有点简单,楼主就当看笑话吧!
      

  5.   

    对于事务的特性,我来说一下我之前看到的一个比较浅显易懂的例子。
    比如说在网上转帐从A账户往B账户转100元,需要执行两个操作A账户减少100元,B账户增加100元。这两个操作如果只执行了第一个操作,那么你是不会答应的,因为你损失了100元,而如果只执行了第二个操作,第一个操作,那么你也不会答应。这两个操作要么都同时执行成功,要么都执行失败,否则一个成功,一个失败都是不合理的。
    因此将这两个操作放在一个事务中去执行,事务的原子性,保证了要么都执行,要么都不执行。一致性的话,再举个例子,比如说你刷卡买电影票,步骤是这样的,首先营业员先给你打出一张票,然后你刷卡,拿电影票。这个时候,实际的电影票是资源,而数据库中的电影票是数据。
    营业员如果帮你打出一张票,这个时候,数据库中电影票实际上数目减一了,但是如果你刷卡失败了,实际的电影票资源并没有发生改变,这个时候执行回滚操作,恢复到打票之前的数据。这样保证了资源和数据的一致性。隔离性的话,就是两个事务之间的操作相互之间不会影响,即不会发生脏读、不可重复读和幻象。持久性的话比较好理解,就是事务执行成功以后,数据将保存在数据库中不再发生改变。
      

  6.   


    还是打开俩连接
    SQL> show user                                                                                      
    USER is "SCOTT"
    SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 test1
             2 test2
             3 test3
             4 test4
             5 test5
    在一个连接中进行如下操作:
    SQL> update test01 set name='ok' where id = 1;                                                      1 row updated.SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 ok
             2 test2
             3 test3
             4 test4
             5 test5SQL> savepoint A;                                                                                   Savepoint created.SQL> insert into test01 values (6,'test6');                                                         1 row created.SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 ok
             2 test2
             3 test3
             4 test4
             5 test5
             6 test66 rows selected.SQL> savepoint B;                                                                                   Savepoint created.
    SQL> update test01 set name = 'no' where id = 2;                                                    1 row updated.SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 ok
             2 no
             3 test3
             4 test4
             5 test5
             6 test66 rows selected.
    下边去另一个连接看一下:
    SQL> show user                                                                                      
    USER is "SCOTT"
    SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 test1
             2 test2
             3 test3
             4 test4
             5 test5
    还是以前的数据,这里最容易理解的是隔离性!
    去原来那边继续操作:
    SQL> rollback to savepoint B;                                                                       Rollback complete.SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 ok
             2 test2
             3 test3
             4 test4
             5 test5
             6 test66 rows selected.
    在去另一边看看变化:(其实想一想就明白,应该是没变化,因为rollback to savepoint严格来说只能是事务内的一个rollback操作,事务本身并没有结束)
    SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 test1
             2 test2
             3 test3
             4 test4
             5 test5
    还是原来的数据,没一点变化,因为这边就没任何操作,其实不论那边做什么操作,只要是事务没结束,这边数据永远是那边事务操作前的数据,其实这就体现了一致性!
    继续去那边操作一下:
    SQL> commit;                                                                                        Commit complete.SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 ok
             2 test2
             3 test3
             4 test4
             5 test5
             6 test66 rows selected.
    这回去另一边再看一下:
    SQL> select * from test01;                                                                                  ID NAME
    ---------- ----------
             1 ok
             2 test2
             3 test3
             4 test4
             5 test5
             6 test66 rows selected.
    数据变了,因为那边的事务结束了,这其实既是持续性的体现,也是一致性的体现!楼主不必过多的理解概念,实际上所有的这一切都是为了需求,你做什么样的产品,只要是需求满足!就OK!
    就向楼上举的例子一样,为了需求数据的准确性,出了这个概念!当需求发现技术实现不了时,就会出新的概念!