#DEFINE DBNAME SYS(2023)+'\DB______1' #DEFINE TABLENAME SYS(2023)+'\TABLE______1' * You changes the BUFFERINGMODE here #DEFINE _BUFFERINGMODE 1 CLEAR ERASE FORCEEXT(DBNAME,'*') ERASE FORCEEXT(TABLENAME ,'*') * OPEN SESSION 1 S1=CREATEOBJECT("SESSION") SET DATASESSION TO S1.DATASESSIONID * build a DBC for do the test CREATE DATABASE DBNAME CREATE TABLE TABLENAME ( F1 I) APPEND BLANK * relase exclusive access CLOSE DATABASES SET MULTILOCKS OFF * open share USE TABLENAME IN 100 ALIAS TABLE_ON_SESSION_1 SHARE =CURSORSETPROP("Buffering",_BUFFERINGMODE,100) GO TOP IN 100 ? [BUFFERING's table :],CURSORGETPROP("Buffering",100) ? ALIAS(100),"CURRENT RECNO()",RECNO(100),"CURRENT VALUE",TABLE_ON_SESSION_1.F1 ******************************************************** * NOW SIMULATE ANOTHER SESSION, THIS WRITE ON THE TABLE NOW =anotherSession('transaction_X') ******************************************************** SET DATASESSION TO S1.DATASESSIONID ? ? "EXTREME BUG: THE SESSION 1 WORKAREA IS NOT TOUCHED, THEN" ? "EXPECTED 2 because field value on disk it is 2" ? ALIAS(100),"CURRENT RECNO()",RECNO(100),"CURRENT VALUE",TABLE_ON_SESSION_1.F1 ? ? "NOW RELEASE the table ( VFP release the file handle too" USE IN 100 ? "REOPEN THE TABLE, NOW THE VALUE IT IS CORRECT" USE TABLENAME IN 100 ALIAS TABLE_ON_SESSION_1 EXCLUSIVE ? ALIAS(100),"CURRENT RECNO()",RECNO(100),"CURRENT VALUE",TABLE_ON_SESSION_1.F1 RELEASE S1 CLOSE ALL ERASE FORCEEXT(TABLENAME ,'*') ERASE FORCEEXT(DBNAME,'*') PROCEDURE anotherSession(_alias) ? ? CHR(9),">>>>>>>SIMULATE ANOTHER TRANSACTION, THIS ADD 2 TO THE FIELD VALUE" WITH CREATEOBJECT("SESSION") SET DATASESSION TO .DATASESSIONID USE TABLENAME ALIAS (m._alias) SHARED ? [BUFFERING's table :],CURSORGETPROP("Buffering") BEGIN TRANSACTION REPLACE F1 WITH F1+2 END TRANSACTION ? ALIAS(),"CURRENT RECNO()",RECNO(),"CURRENT VALUE",F1 ENDWITH ? CHR(9),">>>>>>>TRANSACTION IT IS CLOSED, FIELD HAVE VALUE 2" ENDPROCCODE WITHOUT TRANSACTION:
#DEFINE DBNAME SYS(2023)+'\DB______1' #DEFINE TABLENAME SYS(2023)+'\TABLE______1' * You changes the BUFFERINGMODE here #DEFINE _BUFFERINGMODE 1 CLEAR ERASE FORCEEXT(DBNAME,'*') ERASE FORCEEXT(TABLENAME ,'*') * OPEN SESSION 1 S1=CREATEOBJECT("SESSION") SET DATASESSION TO S1.DATASESSIONID * build a DBC for do the test CREATE DATABASE DBNAME CREATE TABLE TABLENAME ( F1 I) APPEND BLANK * relase exclusive access CLOSE DATABASES SET MULTILOCKS OFF * open share USE TABLENAME IN 100 ALIAS TABLE_ON_SESSION_1 SHARE =CURSORSETPROP("Buffering",_BUFFERINGMODE,100) GO TOP IN 100 ? [BUFFERING's table :],CURSORGETPROP("Buffering",100) ? ALIAS(100),"CURRENT RECNO()",RECNO(100),"CURRENT VALUE",TABLE_ON_SESSION_1.F1 ******************************************************** * NOW SIMULATE ANOTHER SESSION, THIS WRITE ON THE TABLE NOW =anotherSession('transaction_X') ******************************************************** SET DATASESSION TO S1.DATASESSIONID ? ? "EXPECTED 2 because field value on disk it is 2" ? ALIAS(100),"CURRENT RECNO()",RECNO(100),"CURRENT VALUE",TABLE_ON_SESSION_1.F1 ? RELEASE S1 CLOSE ALL ERASE FORCEEXT(TABLENAME ,'*') ERASE FORCEEXT(DBNAME,'*') PROCEDURE anotherSession(_alias) ? ? CHR(9),">>>>>>>SIMULATE ANOTHER TRANSACTION, THIS ADD 2 TO THE FIELD VALUE" WITH CREATEOBJECT("SESSION") SET DATASESSION TO .DATASESSIONID USE TABLENAME ALIAS (m._alias) SHARED ? [BUFFERING's table :],CURSORGETPROP("Buffering") REPLACE F1 WITH F1+2 ? ALIAS(),"CURRENT RECNO()",RECNO(),"CURRENT VALUE",F1 ENDWITH ? CHR(9),">>>>>>>TRANSACTION IT IS CLOSED, FIELD HAVE VALUE 2" ENDPROCAs you can observe,